因此,假设所有子数组的最大值为x
,那么,我们可以贪婪地选择O(n)中的每个子数组,以使每个子数组的总和最大且小于或等于x
。创建所有子数组后,如果子数组的数量小于或等于k
,x
则一种可能的解决方案,否则,我们增加x
。
伪代码:
int start = Max_Value_In_Array;
int end = Max_Number;
while(start <= end)
int mid = (start + end)/2;
int subSum = 0;
int numberOfSubArray = 1;
for(int i = 0; i < n; i++){
if(subSum + data[i] > mid){
subSum = data[i];
numberOfSubArray++;
}else{
subSum += data[i];
}
}
if(numberOfSubArray <= k)
end = mid - 1;
else
start = mid + 1;
具有k的时间复杂度O(n log k)是最大可能和。