Leetcode-11-Container-With-Most-Water

Container With Most Water

从两侧开始,每次矮的边界向中间移动。如果两侧相同则随意移动。

  • 求出结果的过程与某个最优解总会有某一刻有相同的某一个边界,但宽度为>=的关系;
  • 如最优为a-b,过程中找到的是c-b,则a>=c;
  • 现在只考虑a>c的情况;反之已经找到最优解,之后如果找到更好的就说明不是最优解;同时可以左右交换以考虑对称的情况;
  • 在这一个边界时,若求出结果这一刻的体积小于这个最优解的时刻,则另一个边界是小于关系,因此会向右移动;
  • 即一定有c<b,否则不会更优;
  • 所以会移动左边界向内,如果不到最优解那里,则肯定还是c’<b,否则比最优解更优。
  • 如果两侧边界相同,则说明更优时两个边界都得增加,否则不会比现在大。

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
class Solution {
public:
int maxArea(vector<int>& height) {
int left = 0, right = height.size() - 1;
int ans = (left < right ? left : right) * (right - left), tempans = 0;
while (left < right) {
if height[left] < height[right] {
int temp = left + 1;
while (height[left] >= height[temp] && temp < right) {
temp++;
}
left = temp;
}
else {
int temp = right - 1;
while (height[right] >= height[temp] && temp > left) {
temp--;
}
right = temp;
}
tempans = (left < right ? left : right) * (right - left);
ans = ans < tempans ? tempans : ans;
}
return ans;
}
};

其实并不需要