leetcode 1014. Capacity To Ship Packages Within D Days的解法(二分查找)

题目大意:把数组w分成d份,每一份求和并求出和的最大值,返回值为最小的和值。

解法:与leetcode 410的解法一样。

思路:

(1)和值的取值范围为[w的最大值,w的所有元素的和],该范围是闭区间;

(2)这个范围是给连续递增区间,那么可以采用二分查找来确定;

(3)二分的条件:如果按照当前取值,得到的分组数量大于d,那么说明取值小了,需要提高取值,反之,降低取值。

代码如下:

class Solution {
public:
    int shipWithinDays(vector<int>& w, int d) {
        int sum=0;
        int max=w[0];
        for(int i=0;i<w.size();i++)
        {
            sum+=w[i];
            if(max<w[i])
            {
                max=w[i];
            }
        }//按照第1步,取[max,sum]区间
        return search(w,d,max,sum);
    }
    int search(vector<int>& w, int d, int l, int h)//按照第2步,二分查找合适的取值
    {
        int mid;
        while(l<h)
        {
            mid=(l+h)/2;
            if(check(w,d,mid))
            {
                l=mid+1;
            }else
            {
                h=mid;
            }
        }
        return l;
    }
    bool check(vector<int>& w, int d,int aim)//按照第3步,看当前取值得到的分组数量并检验
    {
        int cd=0;
        int cs=0;
        for(int i=0;i<w.size();i++)
        {
            cs+=w[i];
            if(cs>aim)
            {
                cs=w[i];
                cd++;
            }
        }
        cd++;
        if(cd>d)
           return true;
        return false;
    }
};

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值