题目:
给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。
返回容器可以储存的最大水量。
说明:你不能倾斜容器。
示例:
题目解析:实质为求两柱体围成的最大矩形面积
思路讲解:
1.暴力求解:两个for循环遍历数组,求出所有面积情况,取最大值。(可以但不推荐,该方法效率较低)
* 2.双指针:两指针分别指向数组左右元素,求出面积后,将数组值较小的指针向另一个指针移动一个单位,得出另一个面积,知道两指针相遇,最后返回面积最大值。
对于方法2:我们为什么每次移动指针移动数组值较小的那个而不是较大的那个呢?
原因:假设左右指针对应数组值为a, b,且a < b ,两指针距离为t,那么面积 S = a*t ;此时若移动数组值大的指针b ,设移动后数组值为b1,俩指针距离为t1, (t1 < t),此时面积为S1 , 若b1 > a,则水容器面积 S1 = a*t1 < S ,若b1 < a, 则S1 = b1*t1 < a*t1 < S; 可见,若移动较大值的指针,得到的面积一定更小,由于我们要求最大面积,所以完全没必要移动数组值较大的指针。
实现代码如下:
int max(int a, int b){
return a > b? a : b;
}
int min(int a, int b){
return a > b? b : a;
}
int maxArea(int* height, int heightSize){
//双指针思想
int left = 0, right = heightSize-1;
int maxCapacity = 0;//最大容量
int capacity = 0;//当前容量
while(left < right){
capacity = min(height[left],height[right])*(right - left);
maxCapacity = max(maxCapacity,capacity);
//左右哪个值小,移动哪个指针,这样容量才有可能变大
if(height[right] < height[left]){
right--;
}else{
left++;
}
}
return maxCapacity;
}
题目链接:力扣11.盛水最多的容器 ,有兴趣的可以玩玩看哦!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)