【C++习题】12.滑动窗口_将 x 减到 0 的最小操作数

文章目录

--

题目链接:

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


题目描述:


解法

正难则反

转化为:找出最长的子数组的长度len,所有的元素的和刚好等于sum-x

  1. left=0,right=0

  2. 进窗口,sum±nums[right]

  3. 判断,sum>target

    出窗口,sum-=nums[left]

  4. 更新结果,sum==target

这里需要注意的是,若当right指向c的时候>target,即right指向c-1的时候<target

此时left往后移动一位,right就不需要从头开始遍历了,因为left指向1的时候,right1~c-1b之间的距离都是<target的。


C++ 算法代码:

cpp 复制代码
class Solution 
{
    public:
    int minOperations(vector<int>& nums, int x) 
    {
        int sum = 0;// 计算数组中所有元素的总和
        for(int a : nums) sum += a;
        int target = sum - x;// 计算目标值,即总和减去x
        // 细节问题
        if(target < 0) return -1;// 如果目标值小于0,说明无论如何操作都无法达到目标,返回-1
        int ret = -1;// 初始化结果为-1,表示尚未找到有效解
        // 使用滑动窗口技术来寻找最长的子数组,其和等于target
        for(int left = 0, right = 0, tmp = 0; right < nums.size(); right++)
        {
            tmp += nums[right]; // 进窗口// 将当前元素加入临时和
            while(tmp > target) // 判断
                tmp -= nums[left++]; // 出窗口// 如果临时和大于目标值,则移动左指针以减少临时和
            if(tmp == target) // 更新结果// 如果临时和等于目标值,则更新结果
                ret = max(ret, right - left + 1);
        }
        if(ret == -1) return ret;// 如果没有找到有效的子数组,返回-1
        else return nums.size() - ret;// 否则,返回需要移除的元素数量,即数组长度减去最长子数组的长度
    }
};

图解

输入:nums = [1,1,4,2,3], x = 5

  1. sum=1+1+4+2+3=11

    target=sum-x=11-5=6

    left = 0, right = 0, tmp = 0

    循环两次后

    tmp == target

    ret = max(ret, right - left + 1)=3

  2. right++,

    tmp > target

    tmp -= nums[left++];

    tmp -= nums[left++];

  3. tmp == target

    ret = max(ret, right - left + 1)=3

    后面步骤差不多,不过多赘述了。

  4. return nums.size() - ret=5

相关推荐
C++ 老炮儿的技术栈3 小时前
我们在设计tcp协议时,要传一个字符串过去,报文:头十长度十内容,是否要把‘\0‘也填入,长度是否包含‘\0‘
开发语言·数据结构·c++·mfc·c
传奇开心果编程3 小时前
【Rust入门练中学】第2课:变量、可变性与常量
开发语言·学习·rust
zr想努力4 小时前
从0开始配置Perforce4环境
开发语言
幸运小圣5 小时前
PointerEvent 常用属性与事件整理【JavaScript】
开发语言·javascript·ecmascript
长谷深风1115 小时前
评测AI Agent:三种裁判各司其职
java·大数据·开发语言·人工智能·ai agent
边境悍匪5 小时前
蜗牛学苑 Java 智能体学习 Day42|项目周开发技术汇总 1 思维导图复盘
java·开发语言·spring boot·学习·spring
君顾16 小时前
本地托管机构管理源码实战:需求拆解、数据建模与多端部署
java·开发语言·托管
传奇开心果编程7 小时前
【Rust入门练中学】 第3课:数据类型
开发语言·学习·rust
泡泡鱼(敲代码中)8 小时前
MySQL 学习笔记:DCL、函数与约束 —— 安全、效率、完整性的三板斧
开发语言·笔记·sql·学习·mysql·gitee
I_belong_to_jesus8 小时前
std::unique_ptr成员函数用法
c++