LeetCode 1011. D일 이내에 패키지를 배송할 수 있는 용량(자바스크립트 솔루션)

5091 단어 algorithmsjavascript

설명:



컨베이어 벨트에는 D일 이내에 한 포트에서 다른 포트로 배송되어야 하는 패키지가 있습니다.

컨베이어 벨트의 i번째 패키지는 weight[i]의 무게를 가집니다. 매일 우리는 컨베이어 벨트에 포장물을 싣습니다(무게 순서대로). 우리는 선박의 최대 중량 용량보다 더 많은 중량을 적재할 수 없습니다.

컨베이어 벨트의 모든 패키지가 D일 이내에 배송되도록 하는 선박의 최소 중량 용량을 반환합니다.

해결책:



시간 복잡도 : O(n^2log(n))
공간 복잡도: O(1)

   // Binary search approach
var shipWithinDays = function(weights, D) {
    function getDays(capacity) {
        let days = 1, total = 0;

        // See how many days it will take to unload all the weights given the current capacity
        for(let n of weights) {
            total += n;
            // Increase days only when we will exceed the capacity
            if(total > capacity) {
                total = n;
                days++;
            }
        }
        return days;
    }

    // Start is the minimum capacity of one day which is the max of all the weights
    // End is the max capacity we could load on one day which is the sum of all the weights
    let start = Math.max(...weights), 
        end = weights.reduce((acc, cur) => acc + cur, 0);

    // The min cacpaity needed is between start and finish
    while(start < end) {
        const mid = Math.floor((end+start)/2);
        // See how many days it would take to unload all the weigths given mid as the current capacity
        const days = getDays(mid);
        // If capacity at mid took more than D days to load, then we can add more weigth on the ships each day which means we need to increase the daily capacity
        if(days > D) start = mid+1;
        // mid might be our answer so we cannot set end to mid-1
        else end = mid;
    }
    return end;
};

좋은 웹페이지 즐겨찾기