数组取min

238 阅读1分钟

给定一个数组,可以给数组添加一个限制数(M),使得数组中的每一个数和限制数(M)取min,要使数组的总和不超过total,求限制最高可以取多少,如果不需要则返回-1。

输入15 12
[1 2 3 4 5]
输出13
输入25 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