Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【滑动窗口】将 x 减到 0 的最小操作数

【滑动窗口】将 x 减到 0 的最小操作数

作者头像
利刃大大
发布于 2025-05-13 00:16:46
发布于 2025-05-13 00:16:46
3600
代码可运行
举报
文章被收录于专栏:csdn文章搬运csdn文章搬运
运行总次数:0
代码可运行

1658. 将 x 减到 0 的最小操作数

1658. 将 x 减到 0 的最小操作数

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

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

示例 1:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
输入:nums = [1,1,4,2,3], x = 5
输出:2
解释:最佳解决方案是移除后两个元素,将 x 减到 0

示例 2:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
输入:nums = [5,6,7,8,9], x = 4
输出:-1

示例 3:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
输入:nums = [3,2,20,1,1,3], x = 10
输出:5
解释:最佳解决方案是移除后三个元素和前两个元素(总共 5 次操作),将 x 减到 0

提示:

  • 1 <= nums.length <= 105
  • 1 <= nums[i] <= 104
  • 1 <= x <= 109

解题思路:正难则反 + 滑动窗口

​ 这道题如果我们直接去求两边的能减到零的组合的话,那是比较复杂的,但是如果我们换个思路,既然要求的是两边的操作数,那么我们正难则反,我们就去求中间那段区间,因为中间那段区间的要求,实际上是和两边区间的要求是相反的!

​ 因为题目要求的是两边区间操作数的和就是要等于 x,那么中间区间的和不就是 sum - x 吗,对不对!其中 sum 就是整个数组的元素和。并且题目要求两边区间操作数的个数最少,那么只要我们中间区间的长度越大,那么两边的操作数不就越少,对不对!

​ 总结一下就是,我们将题目转化为 求数组中间一段最长连续区间,该区间的元素和满足 sum - x

​ 那么既然是一段连续区间内求满足要求的最大长度,那岂不是可以用双指针的 ”滑动窗口“ 来解决!

​ 对的!只不过要注意的是,我们进窗口的时机是 right 一直走就一直进窗口,而出窗口的条件是 tmp > target(参考下面代码中的变量名),而不是 tmp ≥ target,因为当 tmp == target 的时候是我们要更新最大长度的时候!

​ 此外,最后返回的结果要用数组长度减去中间区间的长度,才是两边区间的长度!

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Solution {
public:
    int minOperations(vector<int>& nums, int x) {
        // 先计算数组元素总和
        int sum = 0;
        for(auto e : nums)
            sum += e;

        int target = sum - x; // 这是我们窗口要求的目标和
        if(target < 0)  
            return -1; // 如果总和都小于x,那么直接不用干了

        int left = 0;
        int tmp = 0; // 记录窗口中元素的总和
        int maxlen = -1;
        for(int right = 0; right < nums.size(); ++right)
        {
            tmp += nums[right];
            while(tmp > target)
            {
                tmp -= nums[left++];
            }

            if(tmp == target)
                maxlen = max(minlen, right - left + 1);
        }
        return maxlen == -1 ? -1 : nums.size() - minlen;
    }
};
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-05-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【优选算法】——滑动窗口—1658. 将 x 减到 0 的最小操作数
给你一个整数数组 nums 和一个整数 x 。每一次操作时,你应当移除数组 nums 最左边或最右边的元素,然后从 x 中减去该元素的值。请注意,需要 修改 数组以供接下来的操作使用。
小李很执着
2024/06/15
910
【优选算法】——滑动窗口—1658. 将 x 减到 0 的最小操作数
【优选算法】Sliding-Chakra:滑动窗口的算法流(上)
把一个较长的序列(比如数组、字符串等),划分成一个个固定长度或者动态长度的 “子序列”,这个子序列就被称作窗口 。好比通过一个固定大小的窗框在一幅长画卷上逐步移动,每次窗框圈定的部分就是一个窗口内容,窗口会按照特定的规则在序列上 “滑动”,常见的是每次移动一个元素的位置,新元素进入窗口,同时最靠前的旧元素移出窗口,借此不断更新窗口内的数据集合
DARLING Zero two
2024/12/28
1680
【优选算法】Sliding-Chakra:滑动窗口的算法流(上)
每日一练【将 x 减到 0 的最小操作数】
给你一个整数数组 nums 和一个整数 x 。每一次操作时,你应当移除数组 nums 最左边或最右边的元素,然后从 x 中减去该元素的值。请注意,需要 修改 数组以供接下来的操作使用。
用户11316056
2024/10/16
610
每日一练【将 x 减到 0 的最小操作数】
初识算法 · 滑动窗口(2)
本文的主题是滑动窗口,通过两道题目讲解,一道是最大连续1的个数,一道是将x减到0的最小操作数。
_lazy
2024/10/16
1070
初识算法 · 滑动窗口(2)
【算法刷题指南】滑动窗口
南桥
2024/11/16
880
【优选算法】探索双指针之美(一): 同向双指针缔造滑动窗口
在上一章中想必我们已经领略到了双指针和单调性相遇后擦出的美妙火花,在这章中我们就来一起探索一下同向双指针又有怎样的独特风味
_孙同学
2024/11/13
1330
【优选算法】探索双指针之美(一): 同向双指针缔造滑动窗口
LeetCode 1658. 将 x 减到 0 的最小操作数(哈希)
给你一个整数数组 nums 和一个整数 x 。每一次操作时,你应当移除数组 nums 最左边或最右边的元素,然后从 x 中减去该元素的值。请注意,需要 修改 数组以供接下来的操作使用。
Michael阿明
2021/02/19
8870
【优选算法题练习】day4
3. 无重复字符的最长子串 给定一个字符串 s ,请你找出其中不含有重复字符的最长子串的长度。
摘星
2023/10/15
1340
【优选算法题练习】day4
【C++】滑动窗口算法专题
由于此问题分析的对象是「⼀段连续的区间」,因此可以考虑「滑动窗⼝」的思想来解决这道题。
啊QQQQQ
2024/11/19
1220
【C++】滑动窗口算法专题
解锁高效算法思维:滑动窗口法,让你轻松搞定复杂题!(2)
在算法学习中,滑动窗口是一种常用且高效的技巧,尤其适用于处理数组、字符串等连续数据结构的问题。滑动窗口可以帮助我们在不遍历整个数据集的情况下找到局部最优解,从而提高代码的运行效率。许多经典的算法题都可以通过滑动窗口的思想进行优化解决,比如求子数组的最大和、找到字符串中的特定子串等。
用户11295429
2024/11/21
980
解锁高效算法思维:滑动窗口法,让你轻松搞定复杂题!(2)
【Leetcode】“滑” 出新天地:滑动窗口法的思路转换与问题破解
这道题来自力扣上的题目:1658. 将 x 减到 0 的最小操作数 - 力扣(LeetCode)
用户11288949
2025/01/17
1220
【Leetcode】“滑” 出新天地:滑动窗口法的思路转换与问题破解
【C++例题 / 训练】滑动窗口(总结&&例题)
本篇主要总结关于滑动窗口的相关做题技巧与注意事项,滑动窗口也用到了双指针的内容,可以参考这篇文章【算法/学习】双指针-CSDN博客 ,本篇主要用于在了解滑动窗口的构造后,快速掌握滑动窗口的做题技巧与做题模板,便于以后复习参阅
IsLand1314
2024/10/15
1610
【C++例题 / 训练】滑动窗口(总结&&例题)
【滑动窗口】长度最小的子数组
​ 找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl+1, ..., numsr-1, numsr] ,并返回其长度**。**如果不存在符合条件的子数组,返回 0 。
利刃大大
2025/05/09
750
【滑动窗口】长度最小的子数组
滑动窗口经典题目
❀ 上面那一步就是《双指针经典题目-CSDN博客》双指针经典题目中的《两数之和》的题目,其实滑动窗口本质上就是双指针,只不过它是同向移动的双指针 ❀ 同时我们可以注意一下数据范围:1 <= nums[i] <= 10^4 因此,我们可以知道数据元素都为正数,因此和具有单调性
用户11039529
2024/09/24
1070
滑动窗口经典题目
我爱学算法之——滑动窗口攻克子数组和子串难题(中)
来看这一道题,题目给定一个数组nums和一个整数x;我们可以在数组nums的左边或者右边进行操作(x减去该位置的值);如果x可以减到0就返回最小操作数;如果不能,就返回-1。
星辰与你
2025/03/24
550
我爱学算法之——滑动窗口攻克子数组和子串难题(中)
将x减到零的最小操作数问题
首先这道题,可能如果直接正面从最左最右开始找数值之和为x,这样看起来比较散,而我们不难发现中间肯定会有一段连续的区域,因此leetcode这道题肯定想让我们用这种逆向的思维方式来解决。
羑悻的小杀马特.
2025/01/23
460
将x减到零的最小操作数问题
深入理解滑动窗口算法及其经典应用
滑动窗口技术通常用于解决子数组或子串相关的问题。其主要思想是在数组或字符串上维持一个固定的窗口大小,或在特定条件下调整窗口大小,从而在窗口内进行高效的计算。滑动窗口技术可以帮助我们在O(n)的时间复杂度内解决一些需要遍历整个数组或字符串的问题。 滑动窗口的基本步骤包括:
DevKevin
2024/08/29
3980
滑动窗口详解
暴力解法:枚举出所有的情况,然后判断长度和区间和,这种方法的时间复杂度最优为O(n^2)
2的n次方
2024/10/15
1430
滑动窗口详解
基础算法---滑动窗口
滑动窗口(Sliding Window)是一种在计算机科学中用于解决各种子数组或子字符串问题的技术。滑动窗口技术通过维护一个固定大小的窗口在数组或字符串上移动,从而使得可以在较短的时间内解决一些复杂的问题。这种方法在处理一系列数据时特别高效。滑动窗口(Sliding Window)是一种在计算机科学中用于解决各种子数组或子字符串问题的技术。滑动窗口技术通过维护一个固定大小的窗口在数组或字符串上移动,从而使得可以在较短的时间内解决一些复杂的问题。这种方法在处理一系列数据时特别高效。
用户11305458
2024/10/09
8080
基础算法---滑动窗口
【算法】——滑动窗口专题
三三是该溜子
2024/12/30
850
【算法】——滑动窗口专题
相关推荐
【优选算法】——滑动窗口—1658. 将 x 减到 0 的最小操作数
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验