当前位置: 首页 > news >正文

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

文章目录

    • 题目链接:
    • 题目描述:
    • 解法
    • C++ 算法代码:
    • 图解

题目链接:

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


题目描述:

be4e2ef02360222a0dec317db98f5048


解法

正难则反

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

ce5bd40e1e8e99d99eb4bd3c2ddd1164

  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的。

db66b35e351704bc0061e2d7dcc6f48f


C++ 算法代码:

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,说明无论如何操作都无法达到目标,返回-1int ret = -1;// 初始化结果为-1,表示尚未找到有效解// 使用滑动窗口技术来寻找最长的子数组,其和等于targetfor(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;// 如果没有找到有效的子数组,返回-1else 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

    循环两次后

    59cac87a4f7028f0c7783d7b08be7632

    tmp == target

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

  2. right++,

    tmp > target

    tmp -= nums[left++];

    a686fecd2cf39f8e96af8147c1712bdf

    tmp -= nums[left++];

    8889f30943b8c1660fc0c85b7d773cea

  3. tmp == target

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

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

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


http://www.mrgr.cn/news/59217.html

相关文章:

  • Java 项目 Dockerfile 示例:从基础镜像选择到环境变量配置的详细指南
  • springboot多模块打包时出现Could not resolve dependencies for project
  • 博图软件的使用(一)
  • CSS-层叠性质
  • vue3 树型视图,利用自定义SFC来定义一个TreeItem,然后进行渲染出一个树形。
  • std::abs 和 abs 是一样的吗?
  • vue3+vite 部署npm 包
  • PG数据库之事务处理
  • CANFD SSP第二采样点引发的“风波”分析
  • 数据结构------手撕链表(一)【不带头单向非循环】
  • STM32-HAL库 HC-SR04超声波测距 -- 2024.10.26
  • C++基础:三个字符串也能搞大小?
  • 谈谈你对AQS的理解
  • 百度智能云推出11.11活动,各大云厂商香港服务器优惠活动汇总
  • Spark 基础操作
  • 线程安全-同步与互斥/死锁
  • 读取文件内容,并按数学成绩排名,之后输出显示
  • linux学习笔记 Ubuntu下的守护进程supervisor安装与多项目部署
  • 2024系统架构师---真题考试知识点
  • python如何通过json以及pickle读写保存数据
  • es实现自动补全
  • python 轮子是什么
  • 【Python】Whoosh:全流程自建搜索引擎
  • Linux之远程连接服务器
  • 【机器学习】股票数据爬取与展示分析(有代码链接)
  • 解析三相220V与三相380V变频器的关键差异