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

2023-11-11

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

题目描述

给你一个整数数组 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)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐

  • 启动Fiddler导致浏览器显示“您的连接不是私密连接”

    浏览器出现如下问题 解决 在浏览器受信任的根证书颁发机构列表中添加fiddler证书 fiddler导出根证书 谷歌浏览器证书管理 受信任的根证书颁发机构列表中添加fiddler证书 注意 如果以上操作后还是无效 就在fiddler先重置根
  • Tracy JS 小笔记 - 运算符,条件语句,循环

    运算符 数学运算和字符串连接 任何数据加上字符串都等于字符串 var a 1 1 a 1 2 a 2a12 var a 1 1 a 1 2 a 2a3 var a aa true a aatrue var a 1 0 a NaN NaN N
  • 基于CentOS系统的网站搭建(入门级)

    准备 使用到的网站 非广告 阿里云 https www aliyun com utm content se 1008364713 宝塔面板 宝塔面板下载 免费全能的服务器运维软件 以阿里云为例 入门选择 轻量级应用服务器 选择服务器配置 选
  • 7-3 两个有序链表序列的合并 (20 分)

    已知两个非降序链表序列S1与S2 设计函数构造出S1与S2合并后的新的非降序链表S3 输入格式 输入分两行 分别在每行给出由若干个正整数构成的非降序序列 用 1表示序列的结尾 1不属于这个序列 数字用空格间隔 输出格式 在一行中输出合并后新
  • Redis之十大类型(三)(下)

    3 6 Redis位图 bitmap 由 0 和 1 表示的二进制位的 bit 数组 介绍 用String类型作为底层数据结构实现的一种统计二值状态的数据类型 位图本质是数组 它是基于String数据类型的按位的操作 该数组由多个二进制位组
  • 机器学习之K-means原理详解、公式推导、简单实例(python实现,sklearn调包)

    目录 1 聚类原理 1 1 无监督与聚类 1 2 K均值算法 2 公式推导 2 1 距离 2 2 最小平方误差 3 实例 3 1 python实现 3 2 sklearn实现 4 运行 可直接食用 1 聚类原理 1 1 无监督与聚类 在这部
  • 图像处理中常用数学知识

    2 3 3 赋范空间 每个实数或复数 都有相对应的绝对值或者模 每一个n维矢量 也都可以定义其长度 如果把 长度 的概念推广到一般抽象空间中的元素上 就可以得到范数这个概念 本节完 2 3 6 希尔伯特空间 定义 在由内积所定义的范数意义下
  • windows的cmd常用命令

    文章目录 一 位 二 cmd基本操作 1 win R启动运行 2 打开cmd 3 运行的命令 三 cmd常用命令 1 功能性命令 2 文件操作 3 shutdown 4 tasklist命令 5 taskkill命令 6 查看日志 四 cm
  • vue项目启动Error: Cannot find module ‘imagemin-gifsicle‘

    Error Cannot find module imagemin gifsicle 依赖没有安装完全 可以删除module 然后重新安装依赖
  • C语言学习:平方-->乘方(m的n方)

    平方 直接用两个数 或变量 相乘就可以表示平方 比如x x 不过如果 需要求m的n次方 就需要用到pow x y 乘方 包括开方 这个库函数了 使用pow x y 这个库函数 需要math h头文件 其中x和y都是双精度浮点 double
  • [FPGA开发]解决正点原子Xilinx下载器无法下载、灯不亮的问题

    问题描述 使用正点原子的Xilinx下载器下载时 电脑无法识别下载器 Vivado无法识别开发版 问题解决 1 检查XIlinx下载器的灯是否亮起 亮灯 说明 解决方法 红灯亮起 下载器可以连接到PC 检查开发版是否供电正常 蓝灯亮起 下载
  • pytorch测试模型时根据不同列别的概率值得到具体的分类

    pytorch 分类任务的教程 https pytorch org tutorials beginner blitz cifar10 tutorial html 主要使用的是 predict torch max out data 1 最后的
  • best ajax lib,BEST Currency Converter

    想提升客户的购物体验 以当地货币显示价格可以省去他们很多不必要的时间 也能提升客户与平台的粘度 该插件具备如下优势 1 轻松添加多种货币 按下按钮即可添加160多种货币 像专业人士一样开始国际销售 并鼓励客户购买 2 自动转换价格 价格会根
  • node.js 读取文件的时候 cmd执行脚本,中文(汉字)打印不出来

    node js 读取文件的时候 cmd执行脚本 中文 汉字 打印不出来 文本详情 输出结果 问题原因 txt编码格式不是UTF 8 解决办法 打开TXT文件 点击 文件 gt 另存为 gt 编码改为UTF 8 保存替换 问题解决
  • 【大数据】Flink 详解(五):核心篇 Ⅳ

    本系列包含 大数据 Flink 详解 一 基础篇 大数据 Flink 详解 二 核心篇 大数据 Flink 详解 三 核心篇 大数据 Flink 详解 四 核心篇 大数据 Flink 详解 五 核心篇 大数据 Flink 详解 六 源码篇
  • 通俗易懂的教你编写自己的webpack loader与plugin

    前言 webpack几乎是目前前端开发者无人不知的打包框架 毕竟无论使用什么开发库 都会想到要使用webpack打包 包括各种脚手架cli工具 大部分也采用了webpack作为其打包工具 本文试图用最简单的代码 仅仅使用命令行工具 代码足够
  • spring data jpa使用limit时,抛QuerySyntaxException unexpected token: limit

    异常重现 jpql语句如下 select g from Entity g where g codeUrl codeUrl ORDER BY g createTime DESC limit 1异常原因 limit是特定于某些数据库 例如 my
  • IDEA设置为中文

    按照如下步骤操作即可 下载对应的语言包 中文语言包下载地址 注意此处下载的版本只能是IDEA版本之前的语言包 下载之后的会报错 将下载好的jar包 放在IDEA目录下的lib目录下 点击File Settings 点击Plugins 然后点
  • matlab相关性分析(皮尔逊,肯德尔,斯皮尔曼)

    代码 clc clear load CRO C3 mat data GPP DT VUT REF EVI NDVI NIRv kNDVI LSWI FPAR TA F VPD F SW IN F rho corr data type pea
  • LeetCode题目笔记——1658. 将 x 减到 0 的最小操作数

    文章目录 题目描述 题目难度 中等 方法一 反向思考 双指针求最长子数组 代码 Python 代码 C 方法二 滑动窗口 代码 总结 我把这篇也归到面试题那一栏 因为觉得这题的思路和思考方式还挺好的 或许能用到其他题上 题目描述 给你一个整