410. 배열 최대 합계 분할
설명
음수가 아닌 정수와 정수nums
로 구성된 배열m
이 있으면 배열을 비어 있지 않은 연속 하위 배열m
로 분할할 수 있습니다.
이러한 m
하위 배열 중에서 가장 큰 합을 최소화하는 알고리즘을 작성하세요.
예 1:
Input: nums = [7,2,5,10,8], m = 2
Output: 18
Explanation:
There are four ways to split nums into two subarrays.
The best way is to split it into [7,2,5] and [10,8],
where the largest sum among the two subarrays is only 18.
예 2:
Input: nums = [1,2,3,4,5], m = 2
Output: 9
예 3:
Input: nums = [1,4,4], m = 3
Output: 4
제약:
Input: nums = [7,2,5,10,8], m = 2
Output: 18
Explanation:
There are four ways to split nums into two subarrays.
The best way is to split it into [7,2,5] and [10,8],
where the largest sum among the two subarrays is only 18.
Input: nums = [1,2,3,4,5], m = 2
Output: 9
Input: nums = [1,4,4], m = 3
Output: 4
1 <= nums.length <= 1000
0 <= nums[i] <= 106
1 <= m <= min(50, nums.length)
솔루션
솔루션 1
직관
mid
는 분할 부분largest
을 의미합니다.cnt
, cnt
≤ m
인지 확인합니다.암호
class Solution {
public:
bool check(vector<int>& nums, int m, int largest) {
int sum = 0, cnt = 0;
for (int x : nums) {
if (x > largest) return false;
if (sum + x > largest) {
sum = x;
cnt++;
} else {
sum += x;
}
}
if (sum >= 0) cnt++;
return cnt <= m;
}
int splitArray(vector<int>& nums, int m) {
int l = 0, r = INT_MAX, mid;
while (l < r) {
mid = l + r >> 1;
if (check(nums, m, mid))
r = mid;
else
l = mid + 1;
}
return l;
}
};
복잡성
Reference
이 문제에 관하여(410. 배열 최대 합계 분할), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/jiangwenqi/410-split-array-largest-sum-21m1텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)