【算法滑动窗口】 将x减到0的最小操作数

在这里插入图片描述

将x减到0的最小操作数

    • 个人总结的八步归纳
    • AI的归纳
      • **8步归纳法(极简直白版)**
        • 1. 问题本质
        • 2. 问题特征
        • 3. 切入点
        • 4. 解决流程
        • 5. 每步目标与操作
        • 6. 注意事项
        • 7. 最终目标
        • 8. 整体总结
      • 代码对照(逐行解析)
      • 举个栗子🌰
      • **一句话总结**

题目链接:

将x减到0的最小操作数

题目描述:
给你一个整数数组 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的最短长度的和
也就是:
找出最长的子数组的长度
这个子数组的所有元素的和正好等于sum - x
sum是整个数组的所有元素的和

和之前讨论过的滑动窗口一模一样:

我们这里就直接使用滑动窗口来解决这道题目:

个人总结的八步归纳

第一步:用自己的话,描述一下眼前的这个问题,它是一个怎么样的问题?

要求的是数组左右两边的和等于X的最小长度

第二步:这个问题有哪些特征,能让我们去判断,它属于这一类的问题?
正难则反,可以涉及到连续的长度子数组,以及求最短,最长的长度,这道题目就可以转换为求出一个子数组,要求在这个连续的子数组的和是等于 总数组的和减去x的,最后返回总数组的长度减去子数组的长度,如果这个子数组的和不能等于sum-x,那么就返回-1。

第三步:想要解决这类问题,切入点啥,即第一步我们要从哪里开始?

切入在在于转化为求一个连续子数组的最长的长度,这个子数组的和等于sum-x

第四步:解决这个问题的流程是怎么样的?这里说的流程是指,这道题可以分成12345…步,只要按照12345这个顺序做下去,我们就能解决这个问题。

  1. 定义一个ret变量,初始化为-1,记录子数组的最长长度
  2. 定义一个sum记录总数组的和,n记录总数组的长度
  3. 定义一个target记录sum - x,如果这个target小于0,那返回-1
  4. 定义一个temp记录这个子数组的和
  5. 使用同向双指针去扩展temp的右窗口
  6. 如果temp 的值大于了target,那就左缩窗口
  7. 如果temp 刚好等于target,那就更新re的结果为最大的长度
  8. 最后,如果ret= -1,说明没有这个连续子数组没有刚好等于target的值,那么就返回-1
  9. 如果ret不是等于-1,那么就返回n - ret

第五步:在流程的12345步中,每一步的目标是什么(就是要求到些什么)?每一步需要用到哪些知识

  1. ret为了记录子数组的最长长度
  2. sum 记录总数组长度的值
  3. target记录sum -x的值
  4. temp记录子数组的元素总和
  5. 开始使用滑动窗口去扩展temp的值
  6. 当temp的值大于target时,就要左缩窗口,当temp=target时,更新ret的结果
  7. 如果ret=-1,那就说明没有子数组的和正好等于sum-x
  8. 如果ret !=-1;那就说明有子数组的和刚好等于了sum-x
  9. 最后我们就返回n-ret即可

第六步:要思考在运用这些知识和技巧的时候,有些需要注意的地方。

  1. 记录target时,如果sum - x < 0了,那就直接返回了-1
  2. 使用的是temp来记录子数组的和,来带入滑动窗口中计算
  3. 当temp == target的时候,才会去更新结果
  4. 最后要返回的是-1或者是n-ret

第七步:要解决这个问题,最终的目标是啥?也就是说,我最终要求出的是啥?

最终目标是求出这个总数组中左右子数组的和正好等于x的最小长度
我们将这个目标转换为了:
求出这个总数组中的一个连续的子数组的和正好等于sum-x的最长长度

第八步:重新对上面的第一步至第七步,进行回顾和揣摩(包括问题类型,特征,切入点,解决过程,1234567…步,每步需要用的哪些知识方法)

(2)AI+8步归纳结合
在模仿完题目后,先自己用8步归纳法对错题进行归纳,然后让deepseek,按照8步归纳法的原则,对题目进行总结归纳,你再把自己总结归纳出的东西,跟AI对比,看看有哪些地方可以改进。

AI的归纳

8步归纳法(极简直白版)


1. 问题本质

从数组两端不断删除元素,使删除的元素和等于x,求最少删几次?若做不到,返回-1。


2. 问题特征
  • 逆向思维:求两端删除次数最少 → 等价于求中间保留的连续子数组最长
  • 数学转化:中间子数组的和 = 总和 - x
  • 滑动窗口适用:数组元素全为正数,适合用双指针找连续子数组

3. 切入点
  1. 算数组总和 sum
  2. 算目标值 target = sum - x
    • target < 0:直接返回-1(总和都不够x)
  3. 用滑动窗口找和为target最长子数组

4. 解决流程
  1. 算总和:遍历数组求sum
  2. 算目标target = sum - x,若target < 0返回-1
  3. 滑动窗口
    • 双指针left=0currentSum=0
    • right右移累加元素 → currentSum += nums[right]
    • currentSum > target时,左移left减元素 → currentSum -= nums[left++]
    • currentSum == target时,记录窗口长度right-left+1的最大值
  4. 结果处理
    • 若未找到 → 返回-1
    • 若找到 → 最少操作次数 = 数组长度 - 最长子数组长度

5. 每步目标与操作
步骤做什么为什么这么做
算总和确定中间子数组的目标和转化问题核心条件
滑动窗口找和为target的最长子数组滑动窗口能高效处理连续子数组问题
结果转换将子数组长度转为操作次数原问题要求的是两端的操作次数

6. 注意事项
  • 边界情况1:若target = 0(即sum = x),需删除整个数组 → 返回n
  • 边界情况2:数组全为1,x=5,但总和=3 → 直接返回-1
  • 效率:每个元素最多被访问两次 → 时间复杂度O(n)

7. 最终目标

求最少删除次数 = 数组长度 - 中间最长子数组的长度


8. 整体总结
  1. 问题转化:删除两端 → 保留中间最长
  2. 核心操作:滑动窗口找和为target的最长子数组
  3. 代码框架
    计算总和 → 处理边界 → 滑动窗口找最长子数组 → 返回结果  
    

代码对照(逐行解析)

class Solution {public int minOperations(int[] nums, int x) {int sum = 0;for (int num : nums) sum += num; // 1. 算总和int target = sum - x;           // 2. 算目标值if (target < 0) return -1;      // 边界:总和都不够xint maxLen = -1; // 记录中间最长子数组的长度int left = 0, currentSum = 0;// 3. 滑动窗口找最长子数组for (int right = 0; right < nums.length; right++) {currentSum += nums[right];  // 右指针扩张while (currentSum > target) // 窗口和太大,左指针收缩currentSum -= nums[left++];if (currentSum == target)   // 找到合法窗口maxLen = Math.max(maxLen, right - left + 1);}// 4. 结果处理return maxLen == -1 ? -1 : nums.length - maxLen;}
}

举个栗子🌰

以示例1 nums = [1,1,4,2,3], x = 5

  1. sum = 11target = 11-5 = 6
  2. 找和为6的最长子数组:
    • [1,1,4] 和=6 → 长度3
    • [4,2] 和=6 → 长度2
    • 最长长度为3
  3. 最少操作次数 = 5(总长) - 3 = 2

一句话总结

求两端删最少 → 中间留最长 → 滑动窗口找和为sum-x的最长子数组

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

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

相关文章

RISC-V GPU架构研究进展:在深度学习推理场景的可行性验证

一、新型算力架构的突围战 在英伟达CUDA生态主导的GPU市场中&#xff0c;RISC-V架构正以‌开源基因‌和‌模块化设计‌开辟新赛道。当前主流GPU架构面临两大痛点&#xff1a; 指令集封闭性‌&#xff1a;NVIDIA的SASS指令集与AMD的GCN/RDNA架构均采用私有指令编码&#xff0c…

LVGL -滑动条

1 滑动条 LVGL 的滑动条(Slider)是一个非常有用的控件,允许用户通过拖动滑块或点击滑条来选择一个值。 1.1 基本定义 滑动条允许用户在一个预定义的数值范围内选择一个特定的值。它通常由一个轨道(track)和一个滑块(thumb)组成。用户可以通过点击或拖动滑块来调整数值。…

ROS2学习笔记|Python实现订阅消息并朗读的详细步骤

本教程将详细介绍如何使用 ROS 2 实现一个节点订阅另一个节点发布的消息&#xff0c;并将接收到的消息通过 espeakng 库进行朗读的完整流程。以下步骤假设你已经安装好了 ROS 2 环境&#xff08;以 ROS 2 Humble 为例&#xff09;&#xff0c;并熟悉基本的 Linux 操作。 注意&…

WPF封装常用的TCP、串口、Modbus、MQTT、Webapi、PLC通讯工具类

WPF封装常用通讯工具类 下面我将为您封装常用的TCP、串口、Modbus、MQTT、WebAPI和PLC通讯工具类,适用于WPF应用程序开发。 一、TCP通讯工具类 using System; using System.Net.Sockets; using System.Text; using System.Threading.Tasks;public class TcpClientHelper : …

npm pnpm yarn 设置国内镜像

国内镜像 常用的国内镜像&#xff1a; 淘宝镜像 https://registry.npmmirror.com 腾讯云镜像​​ https://mirrors.cloud.tencent.com/npm/ 华为云镜像​​ https://repo.huaweicloud.com/repository/npm/ CNPM&#xff08;阿里系&#xff09; ​​ https://r.cnpmjs.org/ 清华…

P4552 [Poetize6] IncDec Sequence 题解

P4552 [Poetize6] IncDec Sequence - 洛谷 差分贪心 根据题目&#xff1a;一段区间都加1或减1 &#xff0c; 可以想到差分 构建差分数组&#xff1a;sub 我们要让除了sub[1] , 其他全是0 我们可以的操作是&#xff1a;l1 , r-1 or l-1 , r1 or 一个数1 / -1 所…

Power Query精通指南2:数据转换——透视/逆透视/分组、横向纵向合并数据、条件判断、处理日期时间

文章目录 七、常见数据转换7.1 逆透视7.1.1 逆透视操作7.1.2 重建透视表&#xff0c;更新数据7.1.3 三种逆透视方式&#xff08;逆透视列等价于逆透视其他列&#xff09; 7.2 透视7.3 拆分列7.3.1 将列拆分为多列7.3.2 将列拆分为多行7.3.3 拆分到列后逆透视&#xff08;保留列…

使用线性表实现通讯录管理

目录 &#x1f680;前言&#x1f99c;任务目标&#x1f31f;顺序表实现&#x1f40d;链表实现 &#x1f680;前言 大家好&#xff01;我是 EnigmaCoder。 本文介绍线性表的实验&#xff0c;使用顺序表和链表实现通讯录管理&#xff0c;包含初始化、插入、删除、查询、输出。 &a…

firewall docker 冲突问题解决(亲测有效)

# 关闭iptables&#xff0c;使用firewall systemctl disable iptables # 禁用服务 systemctl stop iptables # 关闭服务 systemctl status iptables # 查看服务状态 systemctl enable firewalld # 设置防火墙开机自启动 systemctl start firewalld # 开启服务 systemctl s…

[250428] Nginx 1.28.0 发布:性能优化、安全增强及新特性

目录 Nginx 1.28.0 稳定版发布主要亮点包括&#xff1a;功能增强&#xff1a;安全性改进&#xff1a;其他&#xff1a; Nginx 1.28.0 稳定版发布 Nginx 官方于 4 月 24 日发布了最新的 1.28.0 稳定版本。此版本基于之前的 1.27.x 主线分支&#xff0c;整合了多项新功能、性能优…

昇腾的CANN是什么?跟英伟达CUDA的有什么联系和区别?【浅谈版】

昇腾的CANN&#xff08;Compute Architecture for Neural Networks&#xff09;是华为专门为AI场景设计的异构计算架构&#xff0c;类似于英伟达的CUDA&#xff0c;但它针对的是华为自家的昇腾AI处理器&#xff08;Ascend系列&#xff09;。简单来说&#xff0c;CANN的作用是连…

C++ STL vector高级特性与实战技巧

引言 各位小伙伴们好&#xff01;上一篇博客我们介绍了vector的基础知识和常见操作&#xff0c;今天我们将更深入地探讨vector的高级特性、内存管理细节以及实战应用技巧。 想象一下vector就像一辆能自动变长的公交车&#xff0c;我们上一篇讲了如何上下车&#xff08;添加删…

使用PageHelper实现分页查询(详细)

一&#xff1a;需求分析与设计 1.1 产品原型 &#xff08;1&#xff09;分页展示&#xff0c;每页展示10条数据&#xff0c;根据员工姓名进行搜索 &#xff08;2&#xff09;业务规则 1.2 接口设计 &#xff08;1&#xff09;操作&#xff1a;查询&#xff0c;请求方式&#xf…

手搓传染病模型(SEICR)

模型描述 SEICR 模型是一种用于描述具有慢性期的传染病传播规律的数学模型。该模型将人群分为五个部分&#xff0c;分别是易感个体&#xff08;Susceptible&#xff0c;S&#xff09;、潜伏期个体&#xff08;Exposed&#xff0c;E&#xff09;、急性期感染个体&#xff08;In…

音视频开源项目列表

音视频开源项目列表 一、多媒体处理框架 通用音视频处理 FFmpeg - https://github.com/FFmpeg/FFmpeg 最强大的音视频处理工具库支持几乎所有格式的编解码提供命令行工具和开发库 GStreamer - https://gitlab.freedesktop.org/gstreamer/gstreamer 跨平台多媒体框架基于管道…

通往“共识空域”的系统伦理演化

随着低空经济逐步从分布式运营向跨区域联动发展&#xff0c;AI无人系统不再只在本地决策&#xff0c;而开始涉及跨城市、跨机构的任务调度与行为协调。这一趋势带来了新的伦理挑战&#xff1a;多系统之间如何达成行动共识&#xff1f;算法背后的价值判断标准能否统一&#xff1…

Elasticsearch 常用的 API 接口

文档类 API Index API &#xff1a;创建并建立索引&#xff0c;向指定索引添加文档。例如&#xff1a;PUT /twitter/tweet/1 &#xff0c;添加一个文档。 Get API &#xff1a;获取文档&#xff0c;通过索引、类型和 ID 获取文档。如GET /twitter/tweet/1。 DELETE API &…

【Vue】性能优化与调试技巧

个人主页&#xff1a;Guiat 归属专栏&#xff1a;Vue 文章目录 1. Vue 性能优化与调试技巧1.1 使用 v-if 替代 v-show 控制条件渲染示例代码&#xff1a; 1.2 组件懒加载&#xff08;异步组件&#xff09;示例代码&#xff1a;效果分析图&#xff08;Mermaid 图表示&#xff09…

广义线性模型三剑客:线性回归、逻辑回归与Softmax分类的统一视角

文章目录 广义线性模型三剑客&#xff1a;线性回归、逻辑回归与Softmax分类的统一视角引言&#xff1a;机器学习中的"家族相似性"广义线性模型(GLMs)基础三位家族成员的统一视角1. 线性回归(Linear Regression)2. 逻辑回归(Logistic Regression)3. Softmax分类(Softm…

【Linux系统篇】:Linux线程控制基础---线程的创建,等待与终止

✨感谢您阅读本篇文章&#xff0c;文章内容是个人学习笔记的整理&#xff0c;如果哪里有误的话还请您指正噢✨ ✨ 个人主页&#xff1a;余辉zmh–CSDN博客 ✨ 文章所属专栏&#xff1a;Linux篇–CSDN博客 文章目录 一.线程创建二.线程等待三.线程终止四.扩展内容1.重谈pthread_…