#力扣:盛最多水的容器
·

题目如上;
简单浏览题目,大家一定会想到暴力枚举法,将所有可能依次列举出来,但这题目难度设置为中等,那暴力枚举一定会超时,于是我们需要更优的算法。
仔细观察,我们可以将最初的容器壁依次往中间推进,将原先较小的壁替换成里面的壁,然后在对比容量是否增加,直到左边和右边重合。
向中间推进的过程中,我们可能会遇到以下几种情况:
1,替换的容器壁比原先小,且宽度减小,则容量一定比原先小;
2,替换的容器壁和原先一样,但宽度减小,则容量一定比原先小;
3,替换的容器壁比原先大,则需要判断容量是否增加;
左右壁向中间推进,我们可以联想到双指针算法,于是我们将最初的容器壁设置在最左边和最右边,然后实现上述思路,即可得到答案。
本题难点:我们很难想到将最初的容器壁设置在最外围然后向中间推进的思路。
算法优点:时间复杂度从O(n2)降至O(n)。
代码如下:
int maxArea(int* height, int heightSize) {
int right=heightSize-1,left=0;
int max=0;
while(right>left){
int minHeight=height[left]<height[right]?height[left]:height[right];
if(max<minHeight*(right-left)){
max=minHeight*(right-left);
}
if(height[right]<height[left]){
right--;
}
else{
left++;
}
}
return max;
}
更多推荐

所有评论(0)