题目描述
链接:https://www.nowcoder.com/questionTerminal/829419bde0e946b6b4fe813ed3972db8?answerType=1&f=discussion
题目中出现最小值最大、最大值最小的描述,一般都是需要二分答案(要求二分的答案具有单调性
以本题为例, 若最终答案为val,那么对于val - 1, val - 2,等等等,所有比val小的值都是可以满足题意的,所以本题答案具有单调性。
答案最小是0,最大时所有元素之和。此为二分的边界
二分的判定为,对于中值val 能否满足将数组分为k段且每段都大于等于val。
由于要求所取的元素是连续的,所以直接累加到>=val即可,统计当所有段的最小值为val时可以将数组分为多少段。 若分成段的个数大于等于k时即满足题意返回true,否则返回false;
public class Solution {
/**
* 分组
* @param n int整型
* @param k int整型
* @param a int整型一维数组
* @return int整型
*/
public int solve (int n, int k, int[] a) {
// write code here
int sum = 0;
for(int i = 0; i < a.length; i++){
sum += a[i];
}
int l = 0, r = sum;
while (l < r){
int mid = (l + r + 1) / 2;
if(check(k, a, mid)){
l = mid;
} else {
r = mid - 1;
}
}
return l;
}
//最小值为val 分成k段是否够满足
public static boolean check(int k, int[] a, int val){
int countK = 0;
int sum = 0;
for(int i = 0; i < a.length; i++){
sum += a[i];
if(sum >= val){
sum = 0;
countK++;
}
}
return countK >= k;
}
} 
京公网安备 11010502036488号