【leetcode】1014. Capacity To Ship Packages Within D Days

題目以下:數組

A conveyor belt has packages that must be shipped from one port to another within D days.this

The i-th package on the conveyor belt has a weight of weights[i].  Each day, we load the ship with packages on the conveyor belt (in the order given by weights). We may not load more weight than the maximum weight capacity of the ship.spa

Return the least weight capacity of the ship that will result in all the packages on the conveyor belt being shipped within D days.code

 

Example 1:blog

Input: weights = [1,2,3,4,5,6,7,8,9,10], D = 5 Output: 15 Explanation: A ship capacity of 15 is the minimum to ship all the packages in 5 days like this: 1st day: 1, 2, 3, 4, 5 2nd day: 6, 7 3rd day: 8 4th day: 9 5th day: 10 Note that the cargo must be shipped in the order given, so using a ship of capacity 14 and splitting the packages into parts like (2, 3, 4, 5), (1, 6, 7), (8), (9), (10) is not allowed. 

Example 2:ip

Input: weights = [3,2,2,4,1,4], D = 3 Output: 6 Explanation: A ship capacity of 6 is the minimum to ship all the packages in 3 days like this: 1st day: 3, 2 2nd day: 2, 4 3rd day: 1, 4 

Example 3:ci

Input: weights = [1,2,3,1,1], D = 4 Output: 3 Explanation: 1st day: 1 2nd day: 2 3rd day: 3 4th day: 1, 1 

 

Note:it

  1. 1 <= D <= weights.length <= 50000
  2. 1 <= weights[i] <= 500

解題思路:首先能夠確認Capacity的最小值是1,最大值是50000*500。由於知道上下限,因此這裏能夠採用二分查找的方法。記w[i]爲前i個包裹的重量和,顯然w是一個遞增的數組,假設Capacity爲mid,那第一天能夠裝載的包裹的重量就是在w中最大的小於或者等於mid的元素,這裏記爲w[j],那次日能裝載的最大重量就是w[j] + mid,同理能夠在w中最大的小於或者等於w[j]+mid的元素,由於w是有序的,因此這裏繼續使用二分查找,若是D天裝載的包裹重量能大於或者等於w[-1],那麼表示mid知足條件,下一步讓 = mid - 1;若是不知足說明則令mid = low + 1,直到找出最小的mid爲止。io

代碼以下:ast

class Solution(object): def shipWithinDays(self, weights, D): """ :type weights: List[int] :type D: int :rtype: int """ w = [] low = 0 for i in weights: low = max(low,i) if len(w) == 0: w += [i] else: w += [w[-1] + i] #print w
        high = 50000*500 res = float('inf') import bisect while low <= high: mid = (low+high)/2 start = 0 times = 1 tmp_weight = mid while times <= D: inx = bisect.bisect_left(w,tmp_weight,start) if inx == len(w): break
                elif tmp_weight == w[inx]: if inx == len(w) - 1: break tmp_weight = w[inx] + mid times += 1
                else: tmp_weight = w[inx-1] + mid times += 1
            #print mid,times
            if times <= D and tmp_weight >= w[-1]: res = min(res,mid) high = mid -1
            else: low = mid + 1

        return res
相關文章
相關標籤/搜索