题目要求
思路
1.正常用双循环外循环i从0开始,内循环从height.size()-1开始去计算每一个值是可以的,但是因为数据量太大,会超时。
2.考虑到超时,需要优化一些,比如第一个选下标1,第二个选下标3和第一个选下标3,第二选择下标1是一样的,所以,内循环遍历到小于
时,数据重复可以跳过,但是优化后还是超时
3.考虑优化高度,如果i一样,height[j] > height[j-1],说明高度要么减小要么不变,但是由于底减少,所以面积肯定降低,所以再拿height[j] > height[j-2]进行比较,只要小于height[j]的都可以跳过。同理如果j一样,height[i] > height[i+1]如果满足这个,也可以跳过。但是优化后还有超时
4.此时说明双循环已经不能满足了,我们采用双指针left和right,此时,底部已经是最大的了,我们可以将两个值较小的那个往中间移动,去寻找更大面积的组合。
代码实现
class Solution {
public:int maxArea(vector<int>& height) {int left = 0;int right = height.size() - 1;int s = 0;int max = 0;while(left < right){int h = min(height[left], height[right]);s = h * (right - left);if(s > max)max = s;//移动指针if(height[left] > height[right])right--;elseleft++;}return max;}
};