从零开始的算法生活 - 双指针篇 (三)

一、题目解析

本题选自:. - 力扣(LeetCode)


本题要求容器体积为两条线之间的距离乘两条线中最低的一条线的高,输出容器体积最大值

二、讲解算法原理

本题给定了一个长度为n的整数数组height,而height中储存的值则为线高。由于木桶效应我们可以知道,决定一个容器的体积的是最短的木板,也就是最短的线。

所以如果我们定义两个指针:left,right

left 代表的左指针,right 代表的右指针

那么该容器的体积可以看为:( right - left )乘以 height【left】和 height【right】中最短的一条。

所以我们可以设 left = 0right = heightSize - 1

设一个临时体积 Vtmp 和最大体积 Vmax

Vtmp =  right - left )* minheight【left】, height【right】

若 Vtmp 大于 Vmax,则 Vmax = Vtmp

如果 height【left】< height【right】 则 left++ ,反之 right --

当 left = right 时停止以上操作

最终返回 Vmax 即为容器最大体积

最后本题代码如下:

int maxArea(int* height, int heightSize) {
    int Vmax = 0;
    int Vtmp = 0;
    int left = 0 ,right = heightSize-1;

    while(left < right){
        Vtmp = (right - left) * (height[left] < height[right] ? height[left] : height[right]);
        if(height[left] > height[right]){
            right--;
        }else{
            left++;
        }
        Vmax = Vmax > Vtmp ? Vmax : Vtmp;

    } 

    return Vmax;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值