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

2023-10-18 17:12

本文主要是介绍【滑动窗口】“正难则反法” 解决最小操作数的问题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在这里插入图片描述

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;elsereturn n - ret;    // 减去最长的子串即为最小操作数}
};

下面则是执行的结果:

7.jpg

复杂度

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

  • 时间复杂度:

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

  • 空间复杂度:

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

在这里插入图片描述

这篇关于【滑动窗口】“正难则反法” 解决最小操作数的问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/234014

相关文章

SQL Server配置管理器无法打开的四种解决方法

《SQLServer配置管理器无法打开的四种解决方法》本文总结了SQLServer配置管理器无法打开的四种解决方法,文中通过图文示例介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录方法一:桌面图标进入方法二:运行窗口进入检查版本号对照表php方法三:查找文件路径方法四:检查 S

怎样通过分析GC日志来定位Java进程的内存问题

《怎样通过分析GC日志来定位Java进程的内存问题》:本文主要介绍怎样通过分析GC日志来定位Java进程的内存问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、GC 日志基础配置1. 启用详细 GC 日志2. 不同收集器的日志格式二、关键指标与分析维度1.

Java 线程安全与 volatile与单例模式问题及解决方案

《Java线程安全与volatile与单例模式问题及解决方案》文章主要讲解线程安全问题的五个成因(调度随机、变量修改、非原子操作、内存可见性、指令重排序)及解决方案,强调使用volatile关键字... 目录什么是线程安全线程安全问题的产生与解决方案线程的调度是随机的多个线程对同一个变量进行修改线程的修改操

Redis出现中文乱码的问题及解决

《Redis出现中文乱码的问题及解决》:本文主要介绍Redis出现中文乱码的问题及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1. 问题的产生2China编程. 问题的解决redihttp://www.chinasem.cns数据进制问题的解决中文乱码问题解决总结

全面解析MySQL索引长度限制问题与解决方案

《全面解析MySQL索引长度限制问题与解决方案》MySQL对索引长度设限是为了保持高效的数据检索性能,这个限制不是MySQL的缺陷,而是数据库设计中的权衡结果,下面我们就来看看如何解决这一问题吧... 目录引言:为什么会有索引键长度问题?一、问题根源深度解析mysql索引长度限制原理实际场景示例二、五大解决

Springboot如何正确使用AOP问题

《Springboot如何正确使用AOP问题》:本文主要介绍Springboot如何正确使用AOP问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录​一、AOP概念二、切点表达式​execution表达式案例三、AOP通知四、springboot中使用AOP导出

Python中Tensorflow无法调用GPU问题的解决方法

《Python中Tensorflow无法调用GPU问题的解决方法》文章详解如何解决TensorFlow在Windows无法识别GPU的问题,需降级至2.10版本,安装匹配CUDA11.2和cuDNN... 当用以下代码查看GPU数量时,gpuspython返回的是一个空列表,说明tensorflow没有找到

解决未解析的依赖项:‘net.sf.json-lib:json-lib:jar:2.4‘问题

《解决未解析的依赖项:‘net.sf.json-lib:json-lib:jar:2.4‘问题》:本文主要介绍解决未解析的依赖项:‘net.sf.json-lib:json-lib:jar:2.4... 目录未解析的依赖项:‘net.sf.json-lib:json-lib:jar:2.4‘打开pom.XM

XML重复查询一条Sql语句的解决方法

《XML重复查询一条Sql语句的解决方法》文章分析了XML重复查询与日志失效问题,指出因DTO缺少@Data注解导致日志无法格式化、空指针风险及参数穿透,进而引发性能灾难,解决方案为在Controll... 目录一、核心问题:从SQL重复执行到日志失效二、根因剖析:DTO断裂引发的级联故障三、解决方案:修复

IDEA Maven提示:未解析的依赖项的问题及解决

《IDEAMaven提示:未解析的依赖项的问题及解决》:本文主要介绍IDEAMaven提示:未解析的依赖项的问题及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝... 目录IDEA Maven提示:未解析的依编程赖项例如总结IDEA Maven提示:未解析的依赖项例如