1658. 将 x 减到 0 的最小操作数

news2025/1/11 4:21:33

解法一:双指针

首先,每次操作可以移除数组 nums 最左边或最右边的元素,那么相当于求出 l 和 r l和r lr使得 [ 0 , l ] + [ r , n − 1 ] [0, l]+[r,n-1] [0,l]+[r,n1]之间所有元素之和等于 x x x,并且元素个数最少。我们可以通过双重循环枚举 l 和 r 变量 l和r变量 lr变量的取值来计算出最小的答案。时间复杂度为 O ( n 2 ) O(n^2) O(n2)


但其实很多区间是不合法的,比如若 [ 0 , l ] [0, l] [0,l]的和已经大于x,那么对于当前的 l l l就不用再去枚举 r r r。通过这种思路,我们使用双指针进行优化。


在这里插入图片描述 R 和 L R和L RL指针移动的次数都为n,因此整个时间复杂度为 O ( n ) O(n) O(n)。对于第一次移动来说,先让 L L L指针移动是为了直接计算右边区间长度为0的情况。对于 − 1 -1 1的情况,若我们的ans最后大于n,那么必然不合法。

  • 时间复杂度: O ( n ) O(n) O(n)
  • 空间复杂度: O ( 1 ) O(1) O(1)
  • 相似题目:2516. 每种字符至少取 K 个 1423. 可获得的最大点数
class Solution {
    public int minOperations(int[] nums, int x) {
        int sum = Arrays.stream(nums).sum(), n = nums.length, l = n - 1, ans = n + 5;
        for (int r = n - 1; r >= 0; r--) {
            while (sum > x && l >= 0) sum -= nums[l--];
            if (sum == x) ans = Math.min(ans, n - r + l); 
            sum += nums[r]; 
        }
        return ans > n ? -1 : ans;
    }
}
class Solution {
public:
    int minOperations(vector<int>& nums, int x) {
        int sum = accumulate(nums.begin(), nums.end(), 0), n = nums.size(), l = n - 1, ans = n + 5;
        for (int r = n - 1; r >= 0; r--) {
            while (sum > x && l >= 0) sum -= nums[l--];
            if (sum == x) ans = min(ans, n - r + l);
            sum += nums[r]; 
        }
        return ans > n ? -1 : ans;
    }
};
class Solution:
    def minOperations(self, nums: List[int], x: int) -> int:
        n = len(nums)
        s, l, ans = sum(nums), n - 1, n + 5
        for r in range(n - 1, -1, -1):
            while s > x and l >= 0:
                s -= nums[l]
                l -= 1
            if s == x:
                ans = min(ans, n - r + l)
            s += nums[r]
        return -1 if ans > n else ans
         

如果有问题,欢迎评论区交流, 如果有帮助到你,请给题解点个赞和收藏哈~~~

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

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

相关文章

马哥架构第1周课程作业

马哥架构第1周课程作业一. 画图解释一次web请求的过程。涉及tcp/ip, dns, nginx&#xff0c;wsgi。二. 编译安装nginx, 详细解读常用参数。三. 基于nginx完成动静分离部署 lamp。php到后端php-fpm, static/ 在nginx本地。3.1 配置 nginx 实现反向代理的动静分离3.2 准备后端 ht…

equals和==的区别

目录 1.基本数据类型和引用数据类型的说明 2. 3.equals 1.基本数据类型和引用数据类型的说明 基本数据类型&#xff1a;byte&#xff0c;short&#xff0c;int&#xff0c;long&#xff0c;float&#xff0c;double&#xff0c;char&#xff0c;boolean。 对应的默认值&…

2-4进程管理-死锁

文章目录一.死锁的概念二.死锁的处理策略1.死锁预防&#xff1a;破坏必要条件&#xff0c;让死锁无法发生2.避免死锁&#xff1a;在动态分配资源的过程中&#xff0c;用一些算法防止系统进入不安全状态&#xff08;1&#xff09;银行家算法&#xff08;2&#xff09;系统安全状…

Java if else分支结构精讲

Java 支持两种选择语句&#xff1a;if 语句和 switch 语句。其中 if 语句使用布尔表达式或布尔值作为分支条件来进行分支控制&#xff0c;而 switch 语句则用于对多个整型值进行匹配&#xff0c;从而实现分支控制。这些语句允许你只有在程序运行时才能知道其状态的情况下&#…

2022:不恋过往,不畏将来

一、开篇 少年有山海&#xff0c;踏过皆繁华。岁月不居&#xff0c;时节如流&#xff0c;时间在指尖悄悄流逝&#xff0c;人生即将翻开新的一年的篇章。2022年&#xff0c;注定是一个不平凡的年份&#xff0c;这一年&#xff0c;我们从关心世界到关心国家&#xff0c;最后关心自…

2023年12306购票平台自动化购票二|解决车次查找与预定

目录 一、说明 1.1、背景 1.2、说明 二、步骤 2.1、点击去购票 2.2、在搜索框中输入车次信息 2.3、点击查找 2.4、出现车次信息&#xff0c;进行筛选&#xff0c;如果有票则点击计入预定车票界面 三、结果 四、小节 一、说明 1.1、背景 接上文&#xff0c;春运抢不到…

适用于 Windows 的 5 大 PDF 编辑器

“如何在 Windows 7/8/10/11 上编辑 PDF 文件&#xff1f;” “适用于 Windows 7/8/10/11的最佳 PDF 编辑器是什么&#xff1f;” 升级到 Windows 7/8/10/11 后&#xff0c;你会发现很多应用程序在新的 Windows 系统上无法运行&#xff0c;包括 PDF 编辑器。然而&#xff0c;一…

POJ 3070 Fibonacci

Time Limit: 1000MSMemory Limit: 65536KTotal Submissions: 30932Accepted: 20284 Description In the Fibonacci integer sequence, F0 0, F1 1, and Fn Fn − 1 Fn − 2 for n ≥ 2. For example, the first ten terms of the Fibonacci sequence are: 0, 1, 1, 2, 3,…

opencv源码之中值滤波medianBlur_SortNet解读

背景中值滤波&#xff0c;最大值滤波&#xff0c;最小值滤波属于排序滤波&#xff0c;常用于图像去噪处理。最大/小值滤波的处理比较好理解&#xff0c;就是逐个比较窗口内的每个数字&#xff0c;每次比较会根据所属任务保留最大值&#xff0c;或最小值。假设滑动窗口是3*3&…

固体物理分子模拟实验(二)MPI的安装

固体物理分子模拟实验&#xff08;二&#xff09;MPI的安装 文章目录固体物理分子模拟实验&#xff08;二&#xff09;MPI的安装前言一、MPI是什么&#xff1f;二、安装步骤&#xff08;Ubuntu22.04mpich-4.0.2&#xff09;1、下载mpich解压包2、安装前置组件3、文件配置&#…

【一文讲通】如何检测数据满足同分布

1 统计指标的方法1.1群体稳定性指标&#xff08;Population Stability Index&#xff0c;PSI&#xff09;群体稳定性指标&#xff08;Population Stability Index&#xff0c;PSI&#xff09;&#xff0c; 衡量未来的样本&#xff08;如测试集&#xff09;及训练样本评分的分布…

【Linux】基础开发工具使用 --- vim

目录 前言 vim的基本概念 具体操作 插入模式 命令模式下的指令 底行模式下的指令 vim的配置 前言 &#x1f367;了解了 Linux 的一些基本的指令之后若要在 Linux 上进行程序的编写&#xff0c;除了 nano 以外&#xff0c;我们还可以选择 vim 进行编写。而 vim 是 vi 升级…

OJ万题详解––孤独的照片(C++详解)

题目 题目描述 Farmer John 最近购入了 N 头新的奶牛()&#xff0c;每头奶牛的品种是更赛牛&#xff08;Guernsey&#xff09;或荷斯坦牛&#xff08;Holstein&#xff09;之一。 奶牛目前排成一排&#xff0c;Farmer John 想要为每个连续不少于三头奶牛的序列拍摄一张照片。 然…

0107-JAVA和JDK的区别

前言 因为工作需要现在也不得不接触后端java语言&#xff0c;对于java和jdk一直存在疑惑&#xff0c;今天就详细总结一下 1.什么是java 人话就是java是一门后端脚本语言和PHP一样 2.什么是jdk JDK的全称是Java Development Kit&#xff0c;直译就是&#xff1a;Java开发工…

真实地址查询——DNS

通过浏览器解析 URL 并生成 HTTP 消息后&#xff0c;需要委托操作系统将消息发送给 Web 服务器。但在发送之前&#xff0c;还有一项工作需要完成&#xff0c;那就是查询服务器域名对应的 IP 地址&#xff0c;因为委托操作系统发送消息时&#xff0c;必须提供通信对象的 IP 地址…

java 基础 - 泛型

泛型 术语中文含义举例Parameterized type参数化的类型ListActual typeparameter实际类型参数StringGeneric type泛型类型ListFormal typeparameter形式类型参数 EUnbounded wildcard type无限制通配符类型List<?>Raw type原始类型ListBounded type parameter有限制类型…

Vue--》Vue3给数据共享增添的改变

目录 数据共享 父向子共享数据 子向父共享数据 父子组件间数据双向同步 兄弟组件共享数据 后代组件共享数据 使用Vue3的setup函数实现后代数据共享 数据共享 在项目开发中&#xff0c;组件之间的关系分为如下3种&#xff1a;父子关系、兄弟关系、后代关系。 父向子共享…

FPGA学习笔记(十二)IP核之FIFO的学习总结

系列文章目录 一、FPGA学习笔记&#xff08;一&#xff09;入门背景、软件及时钟约束 二、FPGA学习笔记&#xff08;二&#xff09;Verilog语法初步学习(语法篇1) 三、FPGA学习笔记&#xff08;三&#xff09; 流水灯入门FPGA设计流程 四、FPGA学习笔记&#xff08;四&…

机器人/人工智能/就业形势2023

机器人/人工智能/就业形势2022https://blog.csdn.net/ZhangRelay/article/details/124441772机器人人工智能课程需求和就业趋势-2022-https://blog.csdn.net/ZhangRelay/article/details/127087308如上已成往事。2023年如何呢&#xff1f;之前文章都过于简洁&#xff0c;很多朋…

浅谈 MySQL 的 Undo log 日志

undo log 存储在类型为 FIL_PAGE_UNDO_LOG 页中。 可以从系统表空间中分配空间&#xff0c;也可以从 undo tablespace 中分配空间。 FIL_PAGE_UNDO_LOG 类型页主要分为四部分&#xff1a; File Header&#xff0c;所有页都有的结构Undo Page Header TRX_UNDO_PAGE_TYPE&#x…