【滑动窗口】“正难则反法” 解决最小操作数的问题

news2025/1/9 20:37:32

在这里插入图片描述

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

文章目录

  • 题目解析
  • 算法原理分析
  • Code
  • 复杂度

题目解析

首先我们来解读一下本题的题目含义

  • 题目会给到我们一个整数数组和一个整数x,我们可以从左侧,也可以从右侧去减,只要让这个x最终减到【0】即可。
  • 不过呢既然可以从左边也可以从右边减的话就一定存在多种方案,我们所需要的话是操作次数最少的那次,看到下面我列出来的两种情况,很明显第二种方法 从右侧删去两个数据更加优的

1.jpg

算法原理分析

接下去我们来介绍一下本题的算法原理

  • 通过刚才的分析相信很多小伙伴认为本题的题目意思并不是很难理解,但是呢想找到对应的解决方案还是比较困难的,在这里的话教大家一种方法叫做 “正难则反法"
  • 题目中要我们去找的是左右两侧的 最小操作数,但是呢这并不好计算,于是我们可以换个思路,将左侧的数据看做是一个整体,记为a;将右侧的数据看做是一个整体,记为b;那么我们可以得出a + b = x
  • 既然左右两侧的是x的话,那么中间的一段就是sum - x。而且既然两边需要最短的话,中间我们要找的就是【最长的那一段】

2.jpg

  • 因此经过上面的步步分析,我们便将题目的意思转换为了去找 数组里面最长子数组的长度,而且它们的和即为sum - x的结果。不过最后我们要返回的结果可不是这个长度len,而是n - len

3.jpg

  • 本题我们还是考虑使用滑动窗口来进行求解,因为滑动窗口本身就是基于【双指针】的,所以读者在看此文的时候可以先看看我『双指针』的专栏题解
  • 我们的right指针还是一样作为向后遍历并进行计数累加的指针,当其没有达到target的时候就继续去作累加的操作,这相当于是【进窗口】的操作。当其到中间这个点的时候此时sum的值只会是 大于或者等于target
  • sum == target 的时候呢便去做更新长度的操作。当sum > target的时候我们就要去考虑【出窗口】的操作,将左侧的left指针所指向的内容从我们所累加的和中减去,然后还需要执行left++让其继续后移

4.jpg

那有同学问:right还需要回来吗,还是持续后移呢?

  • 我们来探讨一下这个问题,因为在中间这个点的时候sum >= target,那从最左侧到这个点前面一个点的总和是< target的,那如果我们使用暴力解法的话在left向后移动的时候,此时如果right再回来的话,其实是没有必要了,因为left++执行了出窗口的操作后,这个sum就更为小了,此时让right--再左移的话只会更小
  • 所以我们的和这个right是不需要回来的,它只会在那个== target的位置或者是> target的位置

5.jpg

💬 最后的代码详解我们马上来看看看【code】部分,不过读者可以根据算法原理的解读自己试着写写看

Code

对于代码而言的话读者基本上就是根据我们前面所描述的去进行书写即可,还有一些细节地方需要注意

  • 题目中给到的提示这一块,即数组里面所有的数据都是大于1的,那么我们数组中找这个target的时候是不会出现负数这种情况的,所以若是遇到这种情况的,我们直接return -1即可

6.jpg

以下是整体的代码详解:


class Solution {
public:
  int minOperations(vector<int>& nums, int x) {
      int n = nums.size();
      int sum1 = 0;    // 用于先行求出整个数组的和
      int sum2 = 0;    // 用于遍历数组时的累加
      int ret = -1;

      for(int a : nums)   sum1 += a; 
      int target = sum1 - x;      // 减去两端的数据后中间的和

      // 处理细节:数组中不会存在负数, 若存在的话则表示找不到
      if(target < 0)  return -1;
      for(int left = 0, right = 0; right < n; ++right)
      {
          // 1.进窗口
          sum2 += nums[right];
          // 累加和超过target则开始出窗口
          while(sum2 > target)
          {
              // 2.出窗口
              sum2 -= nums[left++]; 
          }
          // 3.更新结果
          if(sum2 == target)
              ret = max(ret, right - left + 1);
      }
      if(ret == -1)   
          return ret;
      else
          return n - ret;    // 减去最长的子串即为最小操作数
  }
};

下面则是执行的结果:

7.jpg

复杂度

最后我们来谈一下复杂度这一块

  • 时间复杂度:

对于时间复杂度我们在一开始做了遍历,去累加数组中的和,后面呢又去遍历了一下这个数组,结合一下最后的复杂度还是 O ( n ) O(n) O(n)

  • 空间复杂度:

对于空间复杂度来说,我们并没有开辟出多余的空间,即为 O ( 1 ) O(1) O(1)

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1100346.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

算法通关村第18关【白银】| 回溯热门问题

1.组合总和问题 思路&#xff1a;回溯模板 &#xff08;1&#xff09;确定方法返回值和参数 分析可知遍历数组然后求和值&#xff0c;不需要返回什么值 参数也就是candidates&#xff0c;list&#xff0c;path&#xff0c;target&#xff0c;start &#xff08;2&#xff…

【2023研电赛】基于三维视觉感知的可重构智能表面通信方案

该作品参与极术社区组织的研电赛作品征集活动&#xff0c;欢迎同学们投稿&#xff0c;获取作品传播推广&#xff0c;并有丰富礼品哦~ 基于三维视觉感知的可重构智能表面通信方案 参赛单位&#xff1a;华北水利水电大学 参赛队伍&#xff1a;智能队 指导老师&#xff1a;邵霞 参…

服务器中了locked勒索病毒怎么办,勒索病毒解密,数据恢复

最近一段时间内&#xff0c;相信很多使用金蝶或用友的办公软件的企业&#xff0c;有很多都经历了locked勒索病毒的攻击&#xff0c;导致企业服务器被加密无法正常使用&#xff0c;严重影响了企业的正常工作。通过云天数据恢复中心的解密恢复发现&#xff0c;在今年locked勒索病…

【LeetCode(数据结构与算法)】:反转链表

给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[5,4,3,2,1] 输入&#xff1a;head [1,2] 输出&#xff1a;[2,1] 示例 3&#xff1a; 输入&#xff1a;head [] 输出&#xff1a;[] …

Linux下按键驱动实验

按键驱动和LED驱动原理上来讲基本都是一样的&#xff0c;都是操作GPIO&#xff0c;只不过一个是读取GPIO的高低电平&#xff0c;一个是从GPIO输出高低电平给LED。 本实验使用的开发板是IMX6DL&#xff0c;实验中使用的按键是通过使用下图中P1的EIM_A20和VCC3.3V两个引脚实现的&…

如何选择超声波清洗机、超声波清洗机排行榜

眼镜的日常清洗生活中很多人都会把它给忘记&#xff01;长时间下来眼镜支架就会变成黄色的&#xff0c;非常的难洗掉&#xff0c;从而又浪费了一个眼镜。一副好的眼镜也不便宜的&#xff0c;把换眼镜的钱省下来入一款超声波清洗机&#xff0c;可以大大的减少金钱的支持&#xf…

java基于springboot+vue的厨房预订预约管理系统

历经长达几个月的毕业作品制作&#xff0c;我凭借自己的知识技能&#xff0c;还有大家的指导帮助&#xff0c;能够在学校规定的时间段之内提交毕业作品。虽然已经算是完成了毕业作品&#xff0c;但是付出了这么多心血&#xff0c;还是想把这个作品做得更加完美一点。针对我的毕…

如何通过内网穿透实现远程连接NAS群晖drive并挂载电脑硬盘?

文章目录 前言1.群晖Synology Drive套件的安装1.1 安装Synology Drive套件1.2 设置Synology Drive套件1.3 局域网内电脑测试和使用 2.使用cpolar远程访问内网Synology Drive2.1 Cpolar云端设置2.2 Cpolar本地设置2.3 测试和使用 3. 结语 前言 群晖作为专业的数据存储中心&…

hash join的基本原理是怎样的?

我们知道数据库里面两表关联主要有三种常见的关联方式&#xff0c;即 nested loop joinhash joinmerge join nested loop join在OLTP交易场景占比是最多的&#xff0c;常用于关联字段为主键或索引字段的情况&#xff0c;通过主键或索引以及loop的方式&#xff0c;A表可以快速…

BricsCAD 23 for Mac:轻松驾驭CAD建模的强大工具

如果你正在寻找一款功能强大、操作简便的CAD建模软件&#xff0c;那么BricsCAD 23 for Mac绝对值得你考虑。这款软件将为你提供一套完整的2D和3D设计解决方案&#xff0c;让你在Mac上轻松创建、编辑和修改图形。 一、BricsCAD 23的功能特点 高效的2D和3D建模&#xff1a;Bric…

2652. 倍数求和

2652. 倍数求和 题目方法-【枚举】 & 题目特征-【求计算在给定范围内满足某种条件的整数之和】方法-【容斥原理】 & 题目特征-【计算满足多个条件的元素之和&#xff0c;并且需要避免重复计数】 题目 题目链接&#xff1a;https://leetcode.cn/problems/sum-multiples…

倾斜摄影三维模型的根节点合并的重要性分析

倾斜摄影三维模型的根节点合并的重要性分析 倾斜摄影三维模型的根节点合并是整个模型构建过程中的一个重要环节&#xff0c;具有重要的意义和作用。本文将对倾斜摄影三维模型的根节点合并的重要性进行详细分析。 一、定义和概述 在倾斜摄影三维模型的构建过程中&#xff0c;根…

概率神经网络分类问题程序

欢迎关注“电击小子程高兴的MATLAB小屋” %% 概率神经网络 %% 解决分类问题 clear all; close all; P[1:8]; Tc[2 3 1 2 3 2 1 1]; Tind2vec(Tc) %数据类型的转换 netnewpnn(P,T); Ysim(net,P); Ycvec2ind(Y) %转换回来

一文带你认识高速低侧栅极驱动器 FAN3111ESX 带你深入了解其特点及应用

FAN3111ESX一款低端驱动器产品&#xff0c;是外部 DC 2 至 5 V 参考输入、单通道同相输出、1.4 A 峰值灌电流、1.4 A 源电流低端栅极驱动器。 FAN3111ESX 1A栅极驱动器为驱动一个在低侧开关应用中的 N沟道增强型 MOSFET 而设计。 对于使用低压控制器和其它和驱动器相比使用更…

二维码智慧门牌管理系统:地址管理的现代革命

文章目录 前言一、标准地址的革新二、广泛的应用前景 前言 在科技不断发展和社会进步的背景下&#xff0c;高效、精准、智能的管理系统已经成为当今社会的迫切需求。传统的门牌管理系统在应对这一需求方面已显得力不从心&#xff0c;因此&#xff0c;二维码智慧门牌管理系统的…

力扣每日一题43:字符串相乘

题目描述&#xff1a; 给定两个以字符串形式表示的非负整数 num1 和 num2&#xff0c;返回 num1 和 num2 的乘积&#xff0c;它们的乘积也表示为字符串形式。 注意&#xff1a;不能使用任何内置的 BigInteger 库或直接将输入转换为整数。 示例 1: 输入: num1 "2"…

强化学习基础(1)- 理论和算法

目录 1.基本概念 1.1组成部分 1.2 马尔可夫决策过程 2 有模型强化学习 2.1状态值函数 2.2动作值函数 2.3二者关系 2.4 探索和利用 2.5动态规划&#xff08;DP&#xff09;&#xff08;有模型求解方法&#xff09; 2.5.1预测任务 2.5.1控制任务 3.无模型强化学习 3.1 Valu…

AI全栈大模型工程师(四)OpenAI API初探

五、它是怎么生成结果的? 其实,它只是根据上文,猜下一个词(的概率)…… OpenAI 的接口名就叫「completion」,也证明了其只会「生成」的本质。 下面用程序演示「生成下一个字」。你可以自己修改 prompt 试试。还可以使用相同的 prompt 运行多次。 import openai import…

哪个牌子的电容笔好用?ipad触控笔推荐平价

有哪些电容笔适合学生党入手&#xff1f;苹果Pencil虽然与普通的电容笔&#xff0c;不同的是&#xff0c;这款电容笔同时具有重力传感器和倾斜传感器&#xff0c;而平替电容笔&#xff0c;只有一种倾斜传感器&#xff0c;但在书写方面的体验很不错&#xff0c;可以用来写字&…

JAMA | 多中心临床试验也用RCS方法分析,卒中患者强化血压管理更有利用康复

郑老师统计课程&#xff0c;欢迎点击报名&#xff1a;临床设计与数据分析 课程 2023年9月&#xff0c;外国学者在《JAMA》&#xff08;一区&#xff0c;IF120.7&#xff09;发表题为&#xff1a;" Intensive vs Conventional Blood Pressure Lowering After Endovascular …