LeetCode题目笔记——1658. 将 x 减到 0 的最小操作数

news2025/1/20 1:50:13

文章目录

    • 题目描述
    • 题目难度——中等
    • 方法一:反向思考,双指针求最长子数组
      • 代码/Python
      • 代码/C++
    • 方法二:滑动窗口
      • 代码
    • 总结

  • 我把这篇也归到面试题那一栏,因为觉得这题的思路和思考方式还挺好的,或许能用到其他题上

题目描述

给你一个整数数组 nums 和一个整数 x 。每一次操作时,你应当移除数组 nums 最左边或最右边的元素,然后从 x 中减去该元素的值。请注意,需要 修改 数组以供接下来的操作使用。

如果可以将 x 恰好 减到 0 ,返回 最小操作数 ;否则,返回 -1 。

  • 示例 1:
    输入:nums = [1,1,4,2,3], x = 5
    输出:2
    解释:最佳解决方案是移除后两个元素,将 x 减到 0 。

  • 示例 2:
    输入:nums = [5,6,7,8,9], x = 4
    输出:-1

  • 示例 3:
    输入:nums = [3,2,20,1,1,3], x = 10
    输出:5
    解释:最佳解决方案是移除后三个元素和前两个元素(总共 5 次操作),将 x 减到 0 。

  • 提示:

    • 1 <= nums.length <= 105
    • 1 <= nums[i] <= 104
    • 1 <= x <= 109

题目链接

题目难度——中等

方法一:反向思考,双指针求最长子数组

  仔细看,屏幕上的这个题目。 仔细审题,题目要求每次删除数组首或尾的元素并将x减去这个值,直到x为0,求这个删除操作的最小次数。换一个说法,不就是求最少的首部和尾部的元素之和为x的元素个数吗,所以我们可以先对数组求和,记为total,再进一步,题目就变成求和为total - x的最长子数组,于是就可以用双指针来做。
  这里虽然想到了这个办法,但是因为双指针的经验不多,所以借鉴了一下讨论区里一个大佬的代码思路,大佬的题解传送门。

代码/Python

class Solution:
    def minOperations(self, nums: List[int], x: int) -> int:
        n = len(nums)
        total = sum(nums)	# 实测这里将sum函数换成for循环手动求和的话,结果会快很多
        target = total - x
        if target < 0:
            return -1
        res = -1
        p1 = total = 0
        for p2 in range(n):
            total += nums[p2]
            while total > target:
                total -= nums[p1]
                p1 += 1
            
            if total == target:
                res = max(res, p2 - p1 + 1)

        return -1 if res < 0 else n - res

在这里插入图片描述

代码/C++

class Solution {
public:
    int minOperations(vector<int>& nums, int x) {
        int n = nums.size(), target, p1, p2, res, total;
        p1 = total = 0, res = -1;
        while(p1 < n){
            total += nums[p1++];
        }
        target = total - x;
        if(target < 0){
            return -1;
        }
        total = p1 = 0;
        for(p2 = 0; p2 < n; p2++){
            total += nums[p2];
            while(total > target){
                total -= nums[p1++];
            }
            if(total == target){
                res = max(res, p2 - p1 + 1);
            }
        }
        return res < 0 ? -1 : n - res;
    }
};

在这里插入图片描述

方法二:滑动窗口

  其实滑动窗口的思路跟上面那个差不多,只不过滑动窗口是正向思路,顺着题目的意思。具体的,同样先求和total,如果total < x,即整体都不够x,肯定无法满足要求。这里直接引用官方的滑动窗口题解,官方链接

代码

class Solution:
    def minOperations(self, nums: List[int], x: int) -> int:
        n = len(nums)
        total = 0
        for num in nums:
        	total += num
        if total < x:
            return -1
        
        right = 0
        lsum, rsum = 0, total
        res = n + 1
        for left in range(-1, n - 1):
            if left != -1:
                lsum += nums[left]
            while right < n and lsum + rsum > x:
                rsum -= nums[right]
                right += 1
            
            if lsum + rsum == x:
                res = min(res, left + 1 + n - right)
        
        return res if res <= n else -1

总结

  两种方法一个正向,一个反向,个人觉得反向的思路要更好一点,更容易理解一些,都需要遍历一遍,所以时间是O(N),都只用到了常量变量,所以空间是O(1)。

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

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

相关文章

基于Node.js Vue清新严选助农电商平台/电商平台/购物平台

摘 要网络技术的快速发展给各行各业带来了很大的突破&#xff0c;也给各行各业提供了一种新的管理模块&#xff0c;对于清新严选助农电商将是又一个传统管理到智能化信息管理的改革&#xff0c;设计清新严选助农电商平台的目的就是借助计算机让复杂的购买商品操作变简单&#x…

gcc和gdb的使用——Linux

Linux学习全部合集点击即可订阅 “人生得意须尽欢” 这里是目录标题gcc的基本操作gcc处理代码的步骤预处理编译汇编链接头文件和库静态库动态库gdb调试makefile什么是makefile&#xff1f;进度条的实现缓冲区回车和换行git的使用.gitigonregcc的基本操作 编写代码的最基本操作…

【工具Share】用VBA获取批量文件中的同一个单元格内容

最近鼓捣了个工具&#xff0c;可以批量从固定文件夹的excel中获取同一个单元格中的具体内容&#xff08;当然&#xff0c;你也可以根据自己的需要&#xff0c;进行多个单元格内容的取得&#xff09; 可能这么说比较抽象&#xff0c;举例来说比如你在多个相同模板的excel中定义了…

java循环结构的概述

在之前的文章中&#xff0c;已经给大家详细地介绍过变量相关的内容&#xff0c;比如变量的概念、命名规范、变量的定义及底层原理等内容。但其实变量还有作用范围的概念&#xff0c;并且根据作用范围的不同&#xff0c;变量还可以分为成员变量、局部变量等内容。在我们今天开始…

Nacos config 配置中心详解

Nacos 提供用于存储配置和其他元数据的 key/value 存储&#xff0c;为分布式系统中的外部化配置提供服务器端和客户端支持。使用 Spring Cloud Alibaba Nacos Config&#xff0c;您可以在 Nacos Server 集中管理你 Spring Cloud 应用的外部属性配置。Spring Cloud Alibaba Naco…

【算法基础(1)】认识时间复杂度和常用排序算法

1 认识时间复杂度 1.1 什么是时间复杂度&#xff1f; 时间复杂度是一个函数&#xff0c;它定性描述该算法的运行时间&#xff0c;在软件开发中&#xff0c;时间复杂度就是用来方便开发者估算出程序运行时间&#xff0c;通常用算法的操作单元数量来代表程序消耗的时间&#xf…

pageoffice在线编辑word文件并禁止选中

一、整篇文档禁止选中 wordDoc.setDisableWindowSelection(true); //禁止word的选择文字功能 二、根据条件判断是否禁止选中 比如&#xff1a;选中内容超过一定字数&#xff0c;取消选中 解决方案&#xff1a;使用后端提供的OnWordSelectionChange事件。 PageOfficeCtrl po…

sgRNAs基因编辑

CRISPR-Cas9知识学习笔记 https://www.163.com/dy/article/FGCP58KC0532AN5N.html https://crispr.dbcls.jp CRISPR&#xff08;clustered regularly interspaced short palindromic repeats&#xff0c;成簇的规律间隔短回文重复序列&#xff09;和CRISPR-associated protein …

Spring Cloud Gateway服务网关的部署与使用(结合nacos)

一、微服务网关1.什么是微服务网关在传统的单体架构中&#xff0c;我们只需要开放一个服务给客户端调用即可。但是微服务架构中是将一个系统拆分成多个微服务&#xff0c;不同的微服务一般会有不同的网络地址&#xff0c;客户端在访问这些微服务时必须记住几十甚至百个地址&…

springboot多项目结构

微服务的目录结构一般分为如下几个模块&#xff1a; 当我们做的项目稍微大一点之后&#xff0c;就会经常遇到需要把不同的模块分离出来的时候&#xff0c;比如微信的朋友圈、微信支付、聊天服务等模块&#xff0c;像这种微服务项目一般都会把base、common、前端抽离出来。 com…

DP8403国产3W双通道无滤波器D类立体声音频放大器兼容替代CS8403

目标DP8403简介功能框图&#xff1a;DP8403主要特性DP8403简介 DP8403是3W双通道无滤波器D类立体声音频功率放大器芯片&#xff0c;能够以D类放大器的效率提供AB类功率放大器的性能。采用D类结构&#xff0c;DP8403 能够在 4Ω负载和 5V 电源条件下&#xff0c;提供高达 3W 输…

MySQL (五)------数据库三范式、外键约束、多表间关系、多表关联查询、子查询

数据库三范式 好的数据库设计对数据的存储性能和后期的程序开发&#xff0c;都会产生重要的影响。建立科学的&#xff0c;规范的数据库就需要满足一些规则来优化数据的设计和存储&#xff0c;这些规则就称为范式。 1.1 第一范式: 确保每列保持原子性 第一范式是最基本的范式…

深入理解java反射原理

系列文章目录 文章目录系列文章目录前言一、 如何获取反射中的Class对象&#xff1f;二、反射的步骤三、详细解答1. 获取对象类的实例2、newInstance() 的实现方式3、获取Method对象4. 调用invoke()方法。总结前言 反射是在运行状态中&#xff0c;对于任意一个类&#xff0c;都…

C 程序设计教程(10)—— 数据输入函数(scanf)用法详解

C 程序设计教程&#xff08;10&#xff09;—— 数据输入函数&#xff08;scanf&#xff09;用法详解 该专栏主要介绍 C 语言的基本语法&#xff0c;作为《程序设计语言》课程的课件与参考资料&#xff0c;用于《程序设计语言》课程的教学&#xff0c;供入门级用户阅读。 目录…

Ubuntu安装PyTango步骤

继续上一篇&#xff1a; https://blog.csdn.net/woshigaowei5146/article/details/128443892?spm1001.2014.3001.5502 环境 虚拟机&#xff1a;VMware Ubuntun&#xff1a;20.04LTS Tango&#xff1a;9.3.5 安装 PyTango作为官方debian/ubuntu包在linux上可用: for Python…

195:vue+openlayers 加载json格式热力图,调节半径大小和模糊程度

第195个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+openlayers中加载JSON格式的数据,呈现热力图。这里可以调节热力图的半径大小和模糊程度。 直接复制下面的 vue+openlayers源代码,操作2分钟即可运行实现效果 文章目录 示例效果配置方式示例代码(共100行)headDa…

【JavaGuide面试总结】Java高级特性基础篇·上

【JavaGuide面试总结】Java高级特性基础篇上1.为什么 Java 中只有值传递&#xff1f;2.static 关键字使用场景3.Exception 和 Error 有什么区别&#xff1f;4.Checked Exception 和 Unchecked Exception 有什么区别&#xff1f;5.Throwable 类常用方法有哪些&#xff1f;6.fina…

【Linux】缓冲区理解

​&#x1f320; 作者&#xff1a;阿亮joy. &#x1f386;专栏&#xff1a;《学会Linux》 &#x1f387; 座右铭&#xff1a;每个优秀的人都有一段沉默的时光&#xff0c;那段时光是付出了很多努力却得不到结果的日子&#xff0c;我们把它叫做扎根 目录&#x1f449;缓冲区&am…

深入理解ECAPA-TDNN——兼谈Res2Net、ASP统计池化、SENet、Batch Normalization

概述 ECAPA-TDNN是说话人识别中基于TDNN的神经网络&#xff0c;是目前最好的单体模型之一关于TDNN&#xff0c;可以参考深入理解TDNN&#xff08;Time Delay Neural Network&#xff09;——兼谈x-vector网络结构 ECAPA-TDNN TDNN本质上是1维卷积&#xff0c;而且常常是1维膨…

【Django项目开发】角色管理模块的开发(八)

文章目录一、序列化器设计1、嵌套的序列化器设计2、普通的序列化类支持&#xff1a;新增、修改角色名、删除、查询3、用于给某一个角色批量授权的序列化4、用于给某一个角色单一授权&#xff0c;包括取消单一授权二、视图类设计1、包含的接口有哪些2、set_permission_to_role方…