给定一个数组,可以给数组添加一个限制数(M),使得数组中的每一个数和限制数(M)取min,要使数组的总和不超过total,求限制最高可以取多少,如果不需要则返回-1。
输入1:
5 12
[1 2 3 4 5]
输出1:
3
输入2:
5 15
[1 2 3 4 5]
输出2:
-1
解题思路:使用二分答案解。我们确定一道题能否二分,一般是看在给定条件下所得到的结果是否有序,可以看出该题下,随着限制的增加,所得数组的总和也是增加的,且答案具有单调性。
const main = (len, max, arr) => {
const check = (m) => {
let sum = 0;
for (let i = 0; i < arr.length; i++) {
if (arr[i] > m) {
sum += m;
} else {
sum += arr[i];
}
}
return sum;
};
let total = 0;
let arrMax = -1;
for (let i = 0; i < len; i++) {
total += arr[i];
arrMax = Math.max(arrMax, arr[i]);
}
if (total <= max) {
return -1;
}
let r = arrMax;
let l = 0;
let ans = 0;
while (l <= r) {
let mid = (l + r) >> 1;
if (check(mid) <= max) {
ans = mid;
l = mid + 1;
} else {
r = mid - 1;
}
}
return ans;
};
var a = main(5, 12, [1, 2, 3, 4, 5]); // 3
var b = main(5, 15, [1, 2, 3, 4, 5]); // -1