-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathSplitArrayLargestSum.cpp
50 lines (46 loc) · 1.33 KB
/
SplitArrayLargestSum.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
/*Given an array which consists of non-negative integers and an integer m, you can split the array into m non-empty continuous subarrays.
*Write an algorithm to minimize the largest sum among these m subarrays.
*
*Note:
*Given m satisfies the following constraint: 1 ≤ m ≤ length(nums) ≤ 14,000.
*Examples:
*
*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.
*/
class Solution {
public:
bool canSplit(vector<int>& nums,int cut,long long max){
int accumulate=0;
for(auto num:nums){
if((accumulate+num)<=max)
accumulate+=num;
else{
cut--;
accumulate=num;
if(cut<0) return false;
}
}
return true;
}
int splitArray(vector<int>& nums, int m) {
long long right=0,left=0;
for(vector<int>::iterator it=nums.begin();it!=nums.end();it++){
left=max(left,(long long)*it);
right+=*it;
}
while(left<right){
long long mid=(left+right)/2;
if(canSplit(nums,m-1,mid)) right=mid;
else left=mid+1;
}
return left;
}
};