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

二分查找

class Solution {
    public int shipWithinDays(int[] weights, int days) {

        /**
         * 最小运输量为所有货物中最重的那个,否则大于它的货物永远不能运载
         */
        int minLoad = Arrays.stream(weights).max().getAsInt();
        int maxLoad = Arrays.stream(weights).sum();

        while (minLoad < maxLoad) {

            int load = minLoad + (maxLoad- minLoad) / 2;

            if (time(load, weights) > days) {
                minLoad = load + 1;
            }
            else {
                maxLoad = load;
            }
        }

        return minLoad;
    }

    public int time(int load, int[] weights){

        int day = 0;
        int sum = 0;

        for (int i = 0; i < weights.length; i++) {

            /**
             * 如果货物累计重量小于等于运载量,就累计,再计算下一个货物
             */
            if (sum + weights[i] <= load){

                sum += weights[i];

                /**
                 * 如果最后剩余的sum不为空,还需要额外加一天
                 */
                if (i == weights.length - 1){
                    day++;
                }
            }
            else {

                /**
                 * 否则当前货物不动,清空累计,再加一天
                 */
                sum = 0;
                day++;
                i--;
            }
        }

        return day;
    }
}

/**
 * 时间复杂度 O(nlogn)
 * 空间复杂度 O(1)
 */

https://leetcode-cn.com/problems/capacity-to-ship-packages-within-d-days/

posted @ 2021-10-25 22:50  振袖秋枫问红叶  阅读(36)  评论(0)    收藏  举报