leetcode hot100刷题日记——4.盛最多水的容器
解答:
我的思路:
class Solution{public:int maxArea(vector<int>& height){//遍历,我暴力找一下,时间超限// int vol=0;// for(int i=0;i<height.size()-1;i++){// for(int j=i+1;j<height.size();j++){// vol=max(vol,min(height[i],height[j])*(j-i));// }// }// return vol;//思想:依旧是左右指针//我们先从min(height[i],height[j])*(j-i)这个式子来思考//我们想要的:宽度(j-i)尽可能宽,高度min(height[i],height[j])尽可能高,那么乘积就会尽可能最大//如果想简化两重循环,怎么做呢?//在宽度这件事上可以想一想。我们直接弄俩左右指针,一个最左,一个最右,保障宽度直接从最宽开始//左右指针慢慢朝中间走,要保障高度最高=>左右指针走动的条件:永远把较矮高度的指针往里走//这样,最宽有保障,最高也有保障了int left=0,right=height.size()-1;int val=0;while(left<right){val=max(val,min(height[left],height[right])*(right-left));if(height[left]<=height[right]){left++;}else{right--;}}return val;}
};
时间复杂度:O(N)
空间复杂度:O(1)
思考:建议大家去leetcode看看官方题解证明双指针的思路,证明过程很详细link