- 배열 분할 최대 합계 하드
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;
}
};