[路飞]leetcode-1658. 将 x 减到 0 的最小操作数

101 阅读1分钟

给你一个整数数组 nums 和一个整数 x 。每一次操作时,你应当移除数组 nums 最左边或最右边的元素,然后从 x 中减去该元素的值。请注意,需要 修改 数组以供接下来的操作使用。

如果可以将 x 恰好 减到 0 ,返回 最小操作数 ;否则,返回 -1 。力扣原文

示例 1:

输入: nums = [1,1,4,2,3], x = 5
输出: 2
解释: 最佳解决方案是移除后两个元素,将 x 减到 0 。

示例 2:

输入: nums = [5,6,7,8,9], x = 4
输出: -1

示例 3:

输入: nums = [3,2,20,1,1,3], x = 10
输出: 5
解释: 最佳解决方案是移除后三个元素和前两个元素(总共 5 次操作),将 x 减到 0 。

解题:

var binarySearch=function(list,target){
    let left=0,right=list.length-1,mid;
    while(left<=right){
        mid=(right+left)>>1
        if(list[mid]==target)return mid;
        if(target>list[mid]){
            left=mid+1
        }else{
            right=mid-1
        }
    }
    return -1
}
var minOperations = function (nums, x) {
  let sumL = [0],
    sumR = [0];
  for (let i = 0; i < nums.length; i++) {
    sumL[i + 1] = sumL[i] + nums[i];
  }
  for (let i = nums.length - 1; i >= 0; --i) {
    sumR[nums.length - i] = sumR[nums.length - i - 1] + nums[i];
  }
  let result=-1
  for (let i = 0; i < sumL.length; i++) {
      let j=binarySearch(sumR,x-sumL[i])
      if(j===-1)continue;
      if(i+j>nums.length)continue
      if(result===-1||result>j+i)result=i+j
  }
  return result
};