我们可以使用二进制搜索来解决此问题。
因此,假设所有子数组的最大值为
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)是最大可能和。



