力扣11--盛水最多的容器

84 阅读1分钟

力扣11题--盛水最多的容器,题目如下:

屏幕截图 2023-11-05 163801.png

一.问题分析:

首先是一个长度由n控制的数组height,数组的大小我们可以看作是高,题目中所求的是最多盛水量,而盛水的多少是由数组下标和值共同决定的,而所求的值还是最大的,那么还要进行一轮比较.

二.思路:

对于如何求储水量,我们可以用数组下标差与数组值较小的那个相乘,然后和后面求出的值比较值的大小(就是求最大面积).

当然大部分人一开始的做法应该都是采用暴力枚举,利用两重for循环枚举比较每一个面积,但是这样的话时间复杂度就为o(n^2)对于题目来说可能就超时了.

那么我们该怎么去优化一下算法呢??

相信大部分的同学都已经想到了运用双指针的方法:

定义左右指针left right为数组下标,这样一开始数组下标差最大,比较面积,在比较俩个下标数组的大小让两边下标移动(可能说的不清楚),这样的就能够省去一层循环了.

代码实现:

暴力

for (int i = 0; i < height.length - 1; i++) {
    for (int i1 = 0; i1 < height.length - 1; i1++) {
        ret=ret=Math.max(ret,Math.min(height[i],height[i1])*(i1-i));
    }
}

双指针:

int left=0,right=height.length-1;
int ret=0;//计算总面积
for (int i = 0; i < height.length - 1; i++) {
    ret=Math.max(ret,Math.min(height[left],height[right])*(right-left));
    if(height[left]>height[right])
        right--;
    else
        left++;

}

对比下来,双指针的方法显然更加快.

如果有不理解的可以去学习一下双指针算法