刷题日记——将x减到0的最小操作数

将x减到0的最小操作数

题目链接:https://leetcode.cn/problems/minimum-operations-to-reduce-x-to-zero/

题目解读

题目要求移除元素总和等于参数x,这道题给我的第一感觉就是从数组的两边入手,对数据进行加和删除,但是这里有一个问题,如果从数组左右两边进行操作,那么就会两个变量,这样导致可能出现的结果是很多的。所以这道题正确解法仍然是滑动窗口。

错误示例

我在第一次解决这道题目的时候单纯认为只要删除数组左右两边中比x小而比另一个数大的元素即可,如果左右两边的数中较大的一个数大于x,那么就直接删除较小的一个数。代码如下:

class Solution {
public:int minOperations(vector<int>& nums, int x) {int left = 0, right = nums.size() - 1;int retnum = 0;while(left <= right){int mini = nums[left] > nums[right] ? right : left;int maxi = nums[left] > nums[right] ? left : right;if(nums[mini] > x){retnum = -1;break;}if(nums[maxi] <= x){x -= nums[maxi]; ++retnum;if(left == maxi)++left;else--right;}else if(nums[maxi] >= x){x -= nums[mini]; ++retnum;if(left == mini)++left;else--right;}if(x == 0) break;}return retnum;}
};

但是这么做是有问题,毕竟这是一道中等难度的题目,那问题出在哪里呢?

如果只是片面按照上面的说法进行删除,比如删除左右两边较大值后,下一个数继续删除变为负数,那么函数返回-1,认为没有找到符合条件的组合,可是正确的组合应该是删除那个较小的元素,再向后删除正好可以是x减为0;所以从思想上这个算法就是错误的。

正确解法

这道题从正面来解决着实难度很大,当左右两边的元素都可以删除的时候并不能确定到底要删除哪边;但是反过来想这道题就可以想到一个简单的解决思路,这也是遇到很多滑动窗口的难题时可以解决的一个办法。具体思路如下:

要是删除元素的总和等于x,不就等于让剩下的连续数组的总和为sum(整个元素的总和)- x。所以可以设置两个指针left和right分别指向滑动窗口的起始和结束位置,然后计算数组的长度,题目要求返回最小操作数,那么要求的就是滑动窗口的最大长度。代码如下:

class Solution {
public:int minOperations(vector<int>& nums, int x) {int left = 0, right = 0;int target = 0;for(auto e : nums){target += e;}target -= x;int sum = 0;int retnum = -1;while(right < nums.size()){sum += nums[right];while(sum > target && left <= right){sum -= nums[left++];}if(sum == target){int comp = right - left + 1;retnum = comp > retnum ? comp : retnum;}++right;}if(retnum == -1) return retnum;elsereturn nums.size() - retnum;}
};

这里要注意一个特殊情况(我犯的错误)

如果你直接看了解题思路去写代码,有可能会写成这样的代码,在提交的时候会有一个测试用例过不去,那么看似正确的逻辑到底是哪里出了问题?

测试用例是这样的,仔细观察就会发现x的值等于数组中所有元素的集合,那为什么会导致执行错误呢?

返回代码中,while循环是让sum>=target的时候就可以进入循环然后先进行判断,判断后减去left指向的值的大小然后再让left指针后移,程序第一次进入while循环后sum不为0,减去left指向元素的大小后为0,可是right指针未刷新,left大于了right,所以会退出while循环,导致永远不会刷新retnum的值,最终返回-1

反思一下为什么会犯错,我认为主要还是没有想到这个特殊情况,其次就是对指针的移动先后顺序没有一个好的把握,比如这种对属于移动后进行判断,我认为不要揉在一起,移动结束后进行判断更稳妥一些。

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

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

相关文章

滚雪球学Java(24):Java反射

&#x1f3c6;本文收录于「滚雪球学Java」专栏&#xff0c;专业攻坚指数级提升&#xff0c;助你一臂之力&#xff0c;带你早日登顶&#x1f680;&#xff0c;欢迎大家关注&&收藏&#xff01;持续更新中&#xff0c;up&#xff01;up&#xff01;up&#xff01;&#xf…

EasySwipeMenuLayout - 独立的侧滑删除

官网 GitHub - anzaizai/EasySwipeMenuLayout: A sliding menu library not just for recyclerview, but all views. 项目介绍 A sliding menu library not just for recyclerview, but all views. Recommended in conjunction with BaseRecyclerViewAdapterHelper Feature…

TS泛型的使用

函数中使用泛型&#xff1a; function identity<T>(arg: T): T {return arg; }let result identity<number>(10); // 传入number类型&#xff0c;返回number类型 console.log(result); // 输出: 10let value identity<string>(Hello); // 传入string类型&a…

ad18学习笔记十二:如何把同属性的元器件全部高亮?

1、先选择需要修改的器件的其中一个。 2、右键find similar objects&#xff0c;然后在弹出的对话框中&#xff0c;将要修改的属性后的any改为same 3、像这样勾选的话&#xff0c;能把同属性的元器件选中&#xff0c;其他器件颜色不变 注意了&#xff0c;如果这个时候&#xff…

初学phar反序列化

以下内容参考大佬博客&#xff1a;PHP Phar反序列化浅学习 - 跳跳糖 首先了解phar是什么东东 Phar是PHP的压缩文档&#xff0c;是PHP中类似于JAR的一种打包文件。它可以把多个文件存放至同一个文件中&#xff0c;无需解压&#xff0c;PHP就可以进行访问并执行内部语句。 默认开…

VuePress网站如何使用axios请求第三方接口

前言 VuePress是一个纯静态网站生成器,也就是它是无后端,纯前端的,那想要在VuePress中,发送ajax请求,请求一些第三方接口,有时想要达到自己一些目的 在VuePress中&#xff0c;使用axios请求第三方接口&#xff0c;需要先安装axios&#xff0c;然后引入&#xff0c;最后使用 本文…

爬虫框架Scrapy学习笔记-2

前言 Scrapy是一个功能强大的Python爬虫框架&#xff0c;它被广泛用于抓取和处理互联网上的数据。本文将介绍Scrapy框架的架构概览、工作流程、安装步骤以及一个示例爬虫的详细说明&#xff0c;旨在帮助初学者了解如何使用Scrapy来构建和运行自己的网络爬虫。 爬虫框架Scrapy学…

【Linux学习笔记】权限

1. 普通用户和root用户权限之间的切换2. 权限的三个w2.1. 什么是权限&#xff08;what&#xff09;2.1.1. 用户角色2.1.2. 文件属性 2.2. 怎么操作权限呢&#xff1f;&#xff08;how&#xff09;2.2.1. ugo-rwx方案2.2.2. 八进制方案2.2.3. 文件权限的初始模样2.2.4. 进入一个…

并发编程——synchronized

文章目录 原子性、有序性、可见性原子性有序性可见性 synchronized使用synchronized锁升级synchronized-ObjectMonitor 原子性、有序性、可见性 原子性 数据库事务的原子性&#xff1a;是一个最小的执行的单位&#xff0c;一次事务的多次操作要么都成功&#xff0c;要么都失败…

蓝桥杯 题库 简单 每日十题 day6

01 删除字符 题目描述 给定一个单词&#xff0c;请问在单词中删除t个字母后&#xff0c;能得到的字典序最小的单词是什么&#xff1f; 输入描述 输入的第一行包含一个单词&#xff0c;由大写英文字母组成。 第二行包含一个正整数t。 其中&#xff0c;单词长度不超过100&#x…

记录selenium和chrome使用socks代理打开网页以及查看selenium的版本

使用前&#xff0c;首先打开socks5全局代理。 之前我还写过一篇关于编程中使用到代理的情况&#xff1a; 记录一下python编程中需要使用代理的解决方法_python 使用全局代理_小小爬虾的博客-CSDN博客 在本文中&#xff0c;首先安装selenium和安装chrome浏览器。 参考我的文章…

用VS Code运行C语言(安装VS Code,mingw的下载和安装)

下载并安装VS code。 安装扩展包&#xff1a; 此时&#xff0c;写完代码右键之后并没有运行代码的选项&#xff0c;如图&#xff1a; 接下来安装编译器mingw。 下载链接&#xff1a; https://sourceforge.net/projects/mingw-w64/ 得到压缩包&#xff1a; 解压&#xff1a; …

滚雪球学Java(26):Java进制转换

&#x1f3c6;本文收录于「滚雪球学Java」专栏&#xff0c;专业攻坚指数级提升&#xff0c;助你一臂之力&#xff0c;带你早日登顶&#x1f680;&#xff0c;欢迎大家关注&&收藏&#xff01;持续更新中&#xff0c;up&#xff01;up&#xff01;up&#xff01;&#xf…

由于数字化转型对集成和扩展性的要求,定制化需求难以满足,百数低代码服务商该如何破局?

当政策、技术环境的日益成熟&#xff0c;数字化转型逐步成为企业发展的必选项&#xff0c;企业数字化转型不再是一道选择题&#xff0c;而是决定其生存发展的必由之路。通过数字化转型升级生产方式、管理模式和组织形式&#xff0c;激发内生动力&#xff0c;成为企业顺应时代变…

最新适合小白前端 Javascript 高级常见知识点详细教程(每周更新中)

1. window.onload 窗口或者页面的加载事件&#xff0c;当文档内容完全加载完成会触发的事件&#xff08;包括图形&#xff0c;JS脚本&#xff0c;CSS文件&#xff09;&#xff0c;就会调用处理的函数。 <button>点击</button> <script> btn document.q…

python项目2to3方案预研

目录 官方工具2to3工具安装参数解释基本使用工具缺陷 future工具安装参数解释基本使用工具缺陷 python-modernize工具安装参数解释基本使用工具缺陷 pyupgrade工具安装参数解释基本使用工具缺陷 对比 官方工具2to3 2to3 是Python官方提供的用于将Python 2代码转换为Python 3代…

单例模式(饿汉模式 懒汉模式)与一些特殊类设计

文章目录 一、不能被拷贝的类 二、只能在堆上创建类对象 三、只能在栈上创建类对象 四、不能被继承的类 五、单例模式 5、1 什么是单例模式 5、2 什么是设计模式 5、3 单例模式的实现 5、3、1 饿汉模式 5、3、1 懒汉模式 &#x1f64b;‍♂️ 作者&#xff1a;Ggggggtm &#x…

VM虚拟机CentOS7.9x64 LVM硬盘扩容

软件版本&#xff1a;VMWare Workstation14 虚拟机CentOS 7.9X64位 GParted 0.33.0 一、虚拟机安装gparted软件 sudo yum install epel-release sudo yum install gparted sudo yum install yum-utils git gnome-common gcc-c sudo yum-builddep gparted 二、关闭虚拟机&a…

Hive行转列[一行拆分成多行/一列拆分成多列]

场景&#xff1a; hive有张表armmttxn_tmp&#xff0c;其中有一个字段lot_number&#xff0c;该字段以逗号分隔开多个值&#xff0c;每个值又以冒号来分割料号和数量&#xff0c;如&#xff1a;A3220089:-40,A3220090:-40,A3220091:-40,A3220083:-40,A3220087:-40,A3220086:-4…

用Jmeter进行压测详解

简介&#xff1a; 1.概述 一款工具&#xff0c;功能往往是很多的&#xff0c;细枝末节的地方也很多&#xff0c;实际的测试工作中&#xff0c;绝大多数场景会用到的也就是一些核心功能&#xff0c;根本不需要我们事无巨细的去掌握工具的所有功能。所以本文将用带价最小的方式讲…