Skip to content

Commit 11455a1

Browse files
committed
feat: add container with most water
1 parent 00f65f2 commit 11455a1

File tree

4 files changed

+88
-3
lines changed

4 files changed

+88
-3
lines changed

leetcode/string/valid_parentheses.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
* @Author: Chacha
33
* @Date: 2022-03-31 21:48:11
44
* @Last Modified by: Chacha
5-
* @Last Modified time: 2022-03-31 22:40:30
5+
* @Last Modified time: 2022-04-01 22:05:50
66
*/
77

88
/**
@@ -51,8 +51,8 @@ class Solution
5151

5252
/**
5353
* 判断括号的有效性可以使用「栈」这一数据结构来解决。
54-
* 栈先入后出特点恰好与本题括号排序特点一致,即若遇到左括号入栈,遇到右括号时将对应栈顶左括号出栈,则遍历完所有括号后 stack 仍然为空
55-
*
54+
* 栈先入后出特点恰好与本题括号排序特点一致,即若遇到左括号入栈,
55+
* 遇到右括号时将对应栈顶左括号出栈,则遍历完所有括号后 stack 仍然为空
5656
*
5757
*/
5858
bool Solution::isValid(string s)
Binary file not shown.
Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
/*
2+
* @Author: Chacha
3+
* @Date: 2022-04-01 21:20:42
4+
* @Last Modified by: Chacha
5+
* @Last Modified time: 2022-04-01 22:04:58
6+
*/
7+
8+
/**
9+
*
10+
* 给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。
11+
* 找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。返回容器可以储存的最大水量。
12+
*
13+
* 输入:height = [1,8,6,2,5,4,8,3,7]
14+
* 输出:49
15+
* 解释:图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。
16+
*
17+
* 示例 2:
18+
* 输入:height = [1,1]
19+
* 输出:1
20+
*
21+
* 提示:
22+
* 1. n == height.length
23+
* 2. 2 <= n <= 105
24+
* 3. 0 <= height[i] <= 104
25+
*
26+
*/
27+
28+
#include <vector>
29+
#include <iostream>
30+
#include <math.h>
31+
32+
using namespace std;
33+
34+
class Solution
35+
{
36+
private:
37+
/* data */
38+
public:
39+
int maxArea(vector<int> &height);
40+
};
41+
42+
/**
43+
* 双指针法
44+
* 设两指针i,j,指向的水槽板高度分别为 h[i],h[j],此状态下水槽面积S(i, j)。
45+
* 由于可容纳水的高度由两板中的 短板 决定,因此可得如下 面积公式 :
46+
* S(i, j) = min(h[i], h[j]) × (j − i)
47+
*
48+
* 在每个状态下,无论长板或短板向中间收窄一格,都会导致水槽 底边宽度 −1 变短:
49+
* 1. 若向内移动短板,水槽的短板 min(h[i], h[j]) 可能变大,因此下个水槽的面积可能增大。
50+
* 2. 若向内移动长板,水槽的短板 min(h[i], h[j]) 不变或变小,因此下个水槽的面积 一定变小。
51+
*
52+
* 因此,初始化双指针分列水槽左右两端,循环每轮将短板向内移动一格,并更新面积最大值,直到两个指针相遇时跳出,即可获得最大面积
53+
*
54+
* 算法步骤:
55+
* 1. 初始化:双指针 i, j 分列水槽左右两端
56+
* 2. 循环收窄:直至双指针相遇时跳出
57+
* a. 更新面积最大值 ans
58+
* b. 选定两板高度中的短板,向中间收窄一格
59+
* 3. 返回面积最大值 ans 即可
60+
*
61+
*/
62+
int Solution::maxArea(vector<int> &height)
63+
{
64+
int i = 0, j = height.size() - 1;
65+
int ans = 0;
66+
67+
while (i < j)
68+
{
69+
ans = height[i] < height[j] ? max(ans, (j - i) * height[i++]) : max(ans, (j - i) * height[j--]);
70+
}
71+
72+
return ans;
73+
};
74+
75+
int main(int argc, char const *argv[])
76+
{
77+
Solution s;
78+
79+
vector<int> height = {1, 8, 6, 2, 5, 4, 8, 3, 7};
80+
81+
cout
82+
<< "输入:[1,8,6,2,5,4,8,3,7] 输出:" << s.maxArea(height) << endl;
83+
84+
return 0;
85+
}
Loading

0 commit comments

Comments
 (0)