import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param num int整型ArrayList
* @param m int整型
* @return int整型
*/
public int splitMin (ArrayList<Integer> num, int m) {
//求所有数总和,和最大数
int sum = 0;
int max = num.get(0);
for(int n : num){
sum+=n;
max = max>n?max:n;
}
return getRes(num,m,max,sum);
}
private int getRes(ArrayList<Integer> num,int m,int left ,int right){
int target = (left+right+1)/2;
//从前往后遍历整个数组,sum_sub存子数组和,count存子数组的个数
//sum_max存子数组最大和
int sum_sub = 0;
int count = 1;
int sum_max = 0;
for(int i =0;i<num.size();i++){
if(sum_sub + num.get(i) <= target){
sum_sub+= num.get(i);
}else{ //子数组的和将要超过target时,分割,sum_sub重置,count+1
sum_sub = num.get(i);
count++;
}
sum_max = Math.max(sum_max,sum_sub);
}
System.out.println("target="+target+" sum_max="+sum_max+" count="+count+" left="+left+" right="+right);
//遍历完成后判断count数量
if(count > m){ //分割的多,说明不可行,target值太小
return getRes(num,m,target,right);
}else if(left < right-1){//分割的少,说明可行,但是有缩小空间,target值太大
return getRes(num,m,left,target);
}else{ // left,right正好相等,说明分割的合适,此时输出最大子数组和
return sum_max;
}
}
}