题目描述
知识点
双指针(其实应该是左右指针)
结果
实现
码前思考
我没写出来
代码实现
//使用非常微妙的双指针来解题
//其实解题吧,先从暴力开始,然后考虑暴力有哪些地方可以优化
//这道题目就是典型的先思考暴力解法,然后对暴力中不必要的地方进行优化
//但是能够想到双指针实在是非常难呀!
class Solution {
public:
int maxArea(vector<int>& height) {
int left = 0;
int right = height.size()-1;
int res = 0; //初始化最小为0,因为可能s就是0!
while(left != right){
int s = min(height[left],height[right]) * (right - left);
if(s > res){
res = s;
}
//缩短板,注意思考一下两者相等的情况,其实是很有意思的!
if(height[left] > height[right]){
right--;
}else{
left++;
}
}
return res;
}
};
码后反思
首先这道题目我没有一点的思路!只会暴力,但是想了想这是中等难度的题,不能随便暴力的!然后事实证明暴力的 O ( n 2 ) O(n^2) O(n2)居然也能过题,看来LeetCode不太严格呀。
谈归正传,来看看网友是怎么使用双指针来解决这个问题:
我不知道为什么网友会想到双指针来解题,感觉这种题目很难想到双指针啊。下面只是证明为什么双指针可以。
- 该题双指针的思路是在暴力的基础上进行优化的。具体来说之前暴力的解法是
C
n
2
C_n^2
Cn2的方式,使用双指针对于每次的边缘的那个短板,求解短板在该边缘下的最好面积,即边缘面积。这样最后
left
和right
相遇时,其实暴力所有的情况都考虑了,只是使用了一点短板的性质。具体思路请看参考文档。 - 每次指针的移动,一定的是边缘短板对应的那个指针。因为边缘短板的情况已经考虑完全了,可以舍弃了!