力扣11题--盛水最多的容器,题目如下:
一.问题分析:
首先是一个长度由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++;
}
对比下来,双指针的方法显然更加快.
如果有不理解的可以去学习一下双指针算法