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

news2024/9/27 21:18:39

将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;
        else
            return nums.size() - retnum;
    }
};

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

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

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

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

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

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

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

相关文章

SVN状态图标不显示

问题可能点1&#xff1a;图标覆盖 1、右键找到设置 2、找到图标覆盖 3、重启TortoiseSVN 问题可能点2&#xff1a;注册表图标顺序太靠下&#xff0c;被占用 1、windowsr, 输入regedit进入注册表 2、找到一下目录 计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Cu…

servlet中doGet方法无法读取body中的数据

servlet中doGet方法不支持读取body中的数据。

警惕!多本SCI/SSCI被剔除,9月SCI/SSCI期刊目录已更新~(附下载)

【SciencePub学术】 2023年9月20日&#xff0c;科睿唯安更新了Web of Science核心期刊目录。 继上次SCI期刊目录和SSCI期刊目录更新之后&#xff0c;本次9月更新共有9本期刊发生变动&#xff1a; • SCIE&#xff1a;有3本期刊不再被SCIE期刊目录收录(Editorial De-listing/Pr…

Python 之 shadow 爆破密码脚本编写

文章目录 Linux shadow 爆破脚本Linux shadow 爆破初探Linux shadow 爆破进阶 Linux shadow 爆破脚本 Linux shadow 爆破初探 目的是为了明白其shadow爆破原理 # Linux shadow爆破初探 1import crypt#shadow文件中的一条用户数据 shadow_line "ghui:$y$j9T$DQ2d2fD138…

(JavaEE)(多线程案例)线程池 (简单介绍了工厂模式)(含经典面试题ThreadPoolExector构造方法)

线程诞生的意义&#xff0c;是因为进程的创建/销毁&#xff0c;太重了&#xff08;比较慢&#xff09;&#xff0c;虽然和进程比&#xff0c;线程更快了&#xff0c;但是如果进一步提高线程创建销毁的频率&#xff0c;线程的开销就不能忽视了。 这时候我们就要找一些其他的办法…

基于微信小程序的个人健康管理系统的设计与实现(源码+lw+部署文档+讲解等)

前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌&#x1f497; &#x1f447;&#x1f3fb;…

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

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

CSS 布局 (三) 浮动、定位、多列布局

6、浮动 最初用于在文本块内浮动图像&#xff0c;float属性成为在网页上创建多列布局最常用的工具之一。随着flexbox和grid的出现&#xff0c;它现在又回到了最初的目的&#xff0c;正如本文所解释的那样。 6.1 浮动的背景 引入float属性是为了允许web开发人员实现包含图像在…

Qt Charts简介

文章目录 一.图标类型Charts分类1.折线图和样条曲线图2.面积图和散点图3.条形图4.饼图5.误差棒图6.烛台图7.极坐标图 二.坐标轴Axes类型分类三.图例四.图表的互动五.图表样式主题 一.图标类型Charts分类 图表是通过使用系列类的实例并将其添加到QChart或ChartView实例来创建的…

【Linux】指针常量和常量指针

这个是指针常量&#xff0c;不能修改指向【其实就是引用的原型】&#xff1a;可以理解为const是否限制了星号 这个是常量指针&#xff0c;可以改指向&#xff0c;不能改值&#xff1a;

[Qt/C/C++]JSON和程序发布

文章摘于 爱编程的大丙 文章目录 1. JSON1.1 Json数组1.2 Json对象1.3 注意事项 2. Qt中JSON操作2.1 QJsonValue2.2 QJsonObject2.3 QJsonArray2.4 QJsonDocument2.5 举例2.5.1 写文件2.5.2 读文件 3. cjson库的使用3.1 cJSON结构体3.2 cJson API3.2.1 数据的封装3.2.2 Json对…

搭建自动化 Web 页面性能检测系统 —— 设计篇

页面性能对于用户体验、用户留存有着重要影响&#xff0c;当页面加载时间过长时&#xff0c;往往会伴随着一部分用户的流失&#xff0c;也会带来一些用户差评。性能的优劣往往是同类产品中胜出的影响因素&#xff0c;也是一个网站口碑的重要评判标准。 一、名称解释 前端监控…

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

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

【数据结构】二叉树的节点数,叶子数,第K层节点数,高度,查找x节点,判断是否为完全二叉树等方法

&#x1f490; &#x1f338; &#x1f337; &#x1f340; &#x1f339; &#x1f33b; &#x1f33a; &#x1f341; &#x1f343; &#x1f342; &#x1f33f; &#x1f344;&#x1f35d; &#x1f35b; &#x1f364; &#x1f4c3;个人主页 &#xff1a;阿然成长日记 …

【C++】STL之vector操作

文章目录 简介vector中的成员类型模板参数头文件的包含构造函数vector的访问方式&#xff1a;下标[ ]迭代器范围for 交换swap 简介 vector是stl中的一种数组容器&#xff0c;vector在英文中有矢量的意思&#xff0c;但实际上在数据结构中就是一种类似于数组的结构&#xff1b;…

滚雪球学Java(25):动态代理

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

数据挖掘note(1)

数据挖掘一般分为机器学习和统计学习&#xff0c;大数据学的课程一般是关于机器学习&#xff0c;我们学的浅&#xff0c;主要关于统计学习&#xff0c;示意图如下所示&#xff1a; 这是一个大数据时代&#xff0c;但是数据挖掘的利用率不足0.5%&#xff0c;可见数据挖掘的空间巨…

全国各地演讲口才培训机构信息那么多需要如何选择?

演讲口才是一项非常重要的能力&#xff0c;它不仅可以帮助我们在职场中更好地表达自己&#xff0c;还可以在公共场合中更好地展示自己的个性和魅力。因此&#xff0c;越来越多的人开始关注演讲口才的培训&#xff0c;而全国各地也涌现出了众多的演讲口才培训机构。 选择适合自己…

ReactNative中升级IOS 17版本Crash解决

ReactNative中升级IOS 17版本Crash解决 ReactNative中升级IOS 17版本Crash解决一、问题描述二、原因分析三、解决方案决策3.1 设置宽高为非零值3.2 使用新的UIGraphicsImageRenderer替换就版本的UIGraphicsBeginImageContext 四、可能使用到该API的三方库4.1 react-native-fast…

RK3568开发板SG90 舵机模块的功能实现-迅为电子

1 模块说明 SG90 舵机模块如下图所示: 常见的舵机转向角度有 0-90 度&#xff0c;0-180 度&#xff0c;0-360 度&#xff0c;可以用在垃圾桶项目开盖用&#xff0c;智能小车的全比例转向&#xff0c;摄像头云台&#xff0c;机械臂等。 2 接线说明 SG90 舵机模块上三条线&…