这道题一开始没啥思路啊。。硬着头皮写了个递归最后不出意外的超时了。。
最后看了解答,发现特别简单,直接二分法。。。
二分法
对结果进行二分,最小值为0,最大值为平均数。
每次二分判断中间值满不满足条件,最后就得到了答案。。。。
能用这种方法的关键点在于判断一个值是不是满足特别简单。
所以,一旦做过类似的题,应该马上就会想到了。
class Solution {
public int maximizeSweetness(int[] a, int K) {
int low = 0;
int N = a.length;
int high = Arrays.stream(a).sum()/(K+1);
while(low<high){
int mid = (low+high+1)/2;
if(check(a, mid, K)){
low=mid;
} else {
high=mid-1;
}
}
return low;
}
public boolean check(int[] a, int mid, int K){
int count=0;
int cumsum=0;
for(int num:a){
cumsum+=num;
if(cumsum>=mid){
count++;
cumsum=0;
}
}
return count>=K+1;
}
}