[二分法]leetcode1011:在 D 天内送达包裹的能力(medium)

题目:

1011. 在 D 天内送达包裹的能力

题解:

  • 使用二分法的模板二,二分区间为[包裹的最大值,包裹的总重量],每次二分需要根据mid来计算需要的天数,若天数小于等于D,表示mid值取得过大了,我们需要向左逼近区间[left,mid];若天数大于D,表示mid取得较小,我们需要向右逼近区间[mid+1,right]。

代码如下:

class Solution {
public:
    //思路:二分法,二分区间为[包裹的最大值,包裹的总重量]
    int shipWithinDays(vector<int>& weights, int D) {
        int left=*max_element(weights.begin(),weights.end()),right=accumulate(weights.begin(),weights.end(),0);
        while(left<right){
            //mid表示最低载重,count表示运送天数
            int mid=left+((right-left)>>1);
            int count=1,m=mid;
            for(int &w:weights){
                if(m-w>=0){
                    m-=w;
                }
                else{
                    m=mid-w;
                    count++;
                }
            }
            //count小于等于D,最低载重mid取大了,我们需要向左边逼近[left,mid]
            if(count<=D)right=mid;
            //count大于D,最低载重mid取小了,向右边区间逼近[mid+1,right]
            else left=mid+1;
        }
        return left;
    }
};
发布了512 篇原创文章 · 获赞 175 · 访问量 12万+

猜你喜欢

转载自blog.csdn.net/qq_43152052/article/details/104083088