1658. 将 x 减到 0 的最小操作数
题目链接:https://leetcode.cn/problems/minimum-operations-to-reduce-x-to-zero/
代码
ts
/**
* 1658. 将 x 减到 0 的最小操作数
* https://leetcode.cn/problems/minimum-operations-to-reduce-x-to-zero/
*/
function minOperations(nums: number[], x: number): number {
let left = 0;
let res = -1;
let sum = 0;
const total = nums.reduce((a, b) => a + b, 0);
const target = total - x;
const len = nums.length;
for (let i = 0; i < len; i++) {
sum += nums[i];
while (sum > target) {
sum -= nums[left];
left++;
}
if (sum === target) {
res = Math.max(res, i - left + 1);
}
}
return res === -1 ? -1 : len - res;
}思路
问题转换:从数组两端移除元素使总和为 x,等价于找中间连续子数组,使其和等于 total - x,且长度最大。
使用滑动窗口:
- 计算数组总和
total,目标子数组和target = total - x; - 用
sum记录当前窗口内元素的和; - 右指针向右移动,累加当前元素到
sum; - 当
sum > target时,移动左指针缩小窗口,从sum中减去左端元素,直到sum <= target; - 当
sum === target时,更新最大窗口长度; - 最终答案为
len - maxWindowLength(如果找不到则返回 -1)。
时间复杂度