Leetcode题库 11.盛水最多的容器(双指针法 C实现)

解析

p_0:左”指针”
p_1:右”指针”
Area:当前双”指针”代表面积大小
ret:记录面积最大值

思路

p_0指向数组头部
p_1指向数组尾部
Area为当前双”指针”代表的面积
比较Area与ret大小

若height[p_0]>=height[p_1]
——”指针”p_0+1, ”指针”p_1所代表的面积一定小于Area
——”指针”p_0, ”指针”p_1-1所代表的面积可能大于Area
——要求最大面积, 于是p_1自减1
height[p_0]<height[p_1]
——同理有p_0自加1

原理

如何保证被剔除的p_1/p_0不会与除p_0/p_1外的”指针”形成更大的面积
证明:
若height[p_0]>=height[p_1], 则剔出p_1
”指针”p_0, ”指针”p_1所代表的面积=(p_1-p_0)*height[p_1]
存在i>0, ”指针”p_0+i, 与”指针”p_1形成的面积=(p_1-(p_0+i))*min(height[p_0+i], height[p_1])
比较双方第一项(p_1-p_0) ,(p_1-(p_0+i)) , 得到前者>后者
比较双方第二项height[p_1], min(height[p_0+i], height[p_1]) , 得到前者>=后者
于是有
被剔除的p_1不可能与p_0+i形成更大的面积

height[p_0]<height[p_1], 剔出p_0同理

代码

写法1

int maxArea(int* height, int heightSize){
    int p_0=0,p_1=heightSize-1,Area,ret=0;
    while(p_0!=p_1){
        if(height[p_0]>=height[p_1]){
            Area=(p_1-p_0)*height[p_1];
            p_1--;
        }else{
            Area=(p_1-p_0)*height[p_0];
            p_0++;
        }
        if(ret<=Area)ret=Area;
    }
    return ret;
}

写法2

int maxArea(int* height, int heightSize){
    int *p_0=height,*p_1=p_0+(heightSize-1),Area,ret=0;
    while(p_0!=p_1){
        if(*p_0>=*p_1){
            Area=(p_1-p_0)*(*p_1);
            p_1--;
        }else{
            Area=(p_1-p_0)*(*p_0);
            p_0++;
        }
        if(ret<=Area)ret=Area;
    }
    return ret;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值