LeetCode 11.盛最多水的容器

题目:

给定一个长度为 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.盛水最多的容器 ,有兴趣的可以玩玩看哦!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值