文章目录
- 一、题目
- 二、题解
一、题目
Given an integer array nums and an integer k, split nums into k non-empty subarrays such that the largest sum of any subarray is minimized.
Return the minimized largest sum of the split.
A subarray is a contiguous part of the array.
Example 1:
Input: nums = [7,2,5,10,8], k = 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.
Example 2:
Input: nums = [1,2,3,4,5], k = 2
Output: 9
Explanation: There are four ways to split nums into two subarrays.
The best way is to split it into [1,2,3] and [4,5], where the largest sum among the two subarrays is only 9.
Constraints:
1 <= nums.length <= 1000
0 <= nums[i] <= 106
1 <= k <= min(50, nums.length)
二、题解
答案可能的范围在0-sum之间,且具有单调性
class Solution {
public:int splitArray(vector<int>& nums, int k) {long long sum = 0;for(int num:nums) sum += num;long long l = 0,r = sum,res = 0;while(l <= r){long long mid = l + ((r - l) >> 1);if(f(nums,mid) <= k){r = mid - 1;res = mid;}else l = mid + 1;}return res;}//使数组每一部分的累加和<=limit,最少需要划分成几个部分int f(vector<int>& nums,long long limit){//一次遍历int count = 1;long long sum = 0;for(auto num:nums){if(num > limit) return INT_MAX;if(sum + num > limit){count++;sum = num;}else sum += num;}return count;}
};