Leetcode 410. 분할 배열 최대 합계(이진 검색经典)

  1. 배열 분할 최대 합계 하드
    8.9K
    184
    회사
    정수
    배열 nums와 정수 k가 주어지면 모든 하위 배열의 최대 합계가 최소화되도록 nums를 비어 있지 않은 k 하위 배열로 분할합니다.

분할의 최소화된 최대 합계를 반환합니다.

하위 배열은 배열의 인접한 부분입니다.

예시 1:

입력: nums = [7,2,5,10,8], k = 2
출력: 18
설명: nums를 두 개의 하위 배열로 분할하는 네 가지 방법이 있습니다.
가장 좋은 방법은 이를 [7,2,5]와 [10,8]로 분할하는 것입니다. 여기서 두 하위 배열 중 가장 큰 합은 18입니다.
예 2:

입력: nums = [1,2,3,4,5], k = 2
출력: 9
설명: nums를 두 개의 하위 배열로 분할하는 방법에는 네 가지가 있습니다.
가장 좋은 방법은 이를 [1,2,3]과 [4,5]로 분할하는 것입니다. 여기서 두 하위 배열 중 가장 큰 합은 9에 불과합니다.

제약:

1 <= nums.length <= 1000
0 <= nums[i] <= 106
1 <= k <= min(50, nums.length)

해결 방법 1: 이진 검색.
그런데 이 질문에는 뭔가 문제가 있는 것 같습니다.정확히 k개 그룹으로 나누어서는 안되고, <=k개 그룹으로 나누어야 합니다.

class Solution {
    
    
public:
    int splitArray(vector<int>& nums, int k) {
    
    
        int n = nums.size();
        int totalSum = 0, maxNum = 0;
        for (auto num : nums) {
    
    
            maxNum = max(maxNum, num);
            totalSum += num;
        }
        int start = maxNum, end = totalSum;
        while (start + 1 < end) {
    
    
            int mid = start + (end - start) / 2;
            if (numSubArray(nums, mid) <= k) {
    
    
                end = mid;
            } else {
    
    
                start = mid;
            }
        }
        if (numSubArray(nums, start) <= k) return start;
        return end;
    }
private:
    // return num of subarrays with maximum sum of each subarray
    int numSubArray(vector<int>& nums, int maxSum) {
    
    
        int n = nums.size();
        int res = 0, sum = 0;
        for (int i = 0; i < n; i++) {
    
    
            sum += nums[i];
            if (sum > maxSum) {
    
    
                sum = nums[i];
                res ++;
            }
        }
        if (sum > 0) res++;
        return res;
    }
};

추천

출처blog.csdn.net/roufoo/article/details/132706290