来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/container-with-most-water
- 五遍刷题第一遍–1221
- 五遍刷题第二遍–1223–用时1h
题目描述
给定 n 个非负整数 a1,a2,…,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0)。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。
说明:你不能倾斜容器,且 n 的值至少为 2。
方法
- 枚举(暴力法)
- 双指针法(经常用到)
C++知识点
- ++i与i++
在for循环中的括号括号内时,两者相同。其他情况下,++i代表先自加一后用,i++代表先用后自加一。
- 三目运算符
三目运算表达式:<表达式1>?<表达式2>:<表达式3>
注:”?”运算符的含义是: 先求表达式1的值,如果为真,则执行表达式2,并返回表达式2的结果 ; 如果表达式1的值为假,则执行表达式3 ,并返回表达式3的结果。
int a=1, b=2, z;
z = (a>b) ? a : b;//条件成立赋左值z=a,条件不成立赋右值z=b
=>z=2
- 变量记得要声明
用到的变量记得要声明,无论用 int a = 0;或者int a 都行
代码难点
双指针法中的两个while理解了一段时间才明白:
while (height[i] <= h && i < j) i++;
while (height[j] <= h && i < j) j--;//这两句while的作用就是两端height谁小移动谁!!终于明白了。
代码
- 枚举法
class Solution {
public:
int maxArea(vector<int>& height) {
int max = 0;
for (int i = 0; i<height.size() -1; ++i){
for (int j = i+1; j<height.size(); ++j){
int heightsize = height[i] < height[j] ? height[i] : height[j];
int area = (j-i)*heightsize;
max = max > area ? max:area;
}
}
return max;
}
};
- 双指针法
class Solution {
public:
int maxArea(vector<int>& height) {
int water = 0;
int i = 0, j = height.size() - 1;
while (i < j) {
int h = min(height[i], height[j]);
water = max(water, (j - i) * h);
while (height[i] <= h && i < j) i++;
while (height[j] <= h && i < j) j--;
}
return water;
}
};