1658.将 x 减到 0 的最小操作数:哈希表(+前缀和) / 滑动窗口
【LetMeFly】1658.将 x 减到 0 的最小操作数:哈希表(+前缀和) / 滑动窗口
力扣题目链接:https://leetcode.cn/problems/minimum-operations-to-reduce-x-to-zero/
给你一个整数数组 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 。
提示:
1 <= nums.length <= 1051 <= nums[i] <= 1041 <= x <= 109
解题方法一:哈希表+前缀和
正序遍历一遍数组,将sum(nums[0..i]) -> i存入哈希表。
倒序遍历一遍数组,记录遍历过程中的后缀和$cnt$。如果$x-cnt$在哈希表中,则找到一个可行的移除方法。
- 时间复杂度$O(len(nums))$
- 空间复杂度$O(len(nums))$
AC代码
C++
1 | |
解题方法二:滑动窗口
移除前后缀共计$x$,即使得剩余数组和为$sum-x$。
滑动窗口,每次右边加入窗口一元素,当窗口中元素和大于$sum-x$时不断移除左边元素。若移除结束后窗口中元素和等于$sum-x$,则更新答案。
- 时间复杂度$O(len(nums))$
- 空间复杂度$O(1)$
AC代码
C++
1 | |
同步发文于CSDN和我的个人博客,原创不易,转载经作者同意后请附上原文链接哦~
千篇源码题解已开源
1658.将 x 减到 0 的最小操作数:哈希表(+前缀和) / 滑动窗口
https://blog.letmefly.xyz/2026/09/23/LeetCode 1658.将x减到0的最小操作数/