专题二_滑动窗口_将x减到0的最小操作数

一:题目

解释:每次只能移除数组的边界,移除的边界的总和为x,要求返回你移除边界的最小操作数!

也就是说你最少花几次移除边界,就能够让这些移除的边界的和为x,则返回这个次数!

所以这个题目,肯定是要考虑三种情况

情况1:x为正数,小于整个数组之和,且有解决方案

例子:

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

情况2:x为正数,小于整个数组之和 ,但无解决方案!

输入:nums = [1,1,4,2,3], x = 8
输出:-1
解释:没有解决方案 

本质:x远大于数组的和

情况3:x为正数,但大于整个数组之和 ,所以无解决方案!

输入:nums = [1,1,4,2,3], x = 12
输出:-1
解释:没有解决方案  数组总和都才10

本质:x远大于数组的和

注:x不可能为负数,题目已经规定了x>=1

二:算法

这道题,我们正向解题,是很难的,所以正难则反:

找"一段连续的区域和为sum - x"就可以了

而题目要求的是最小操作数,

所以找的是"最长的连续区域,且区域和为sum - x"

所以上面说过的三种情况,我们就可以进行区分了,假设sum - x的值,用tager来存储,则:

targe<0  代表符合情况3直接返回-1,反之则是情况1和情况2,则仍需要通过计算才可以得知是否存在解决方案

解释:

你只有x不大于数组之和,你是不可能一眼就能看出其有没有解决方案的,所以我们只能实现定义一个返回值,假设为ret,如果ret从始至终都没有被更新过,说明其没有解决方案,反之有解决方案!所以,情况3可以一开始就避免掉,但是情况2和情况1还需根据结果来判断!

①:暴力

O(N^2),left以不同元素作为起点,right向右遍历,如果区间的和==targe,则记录,反之遍历完了都没有符合的,则left++,right从left位置开始向右遍历,继续判断....

注:保留的right肯定是从left开始遍历的,而不是left+1的位置,因为可能left下标的元素就==targe!

②:滑动窗口

暴力能优化的点:

1:left++后,我们的right不需要再回退到left处,而是就在原地!

解释:

left++是因为之前区间的和>targe了,所以更改起点left的位置来重新找,但是此时left++后,数组有三种情况:

a:数组之和仍大于targe,则right不需要懂,而left还需++

b:数组之和==targe,则判断更新结果之后,right再++

c:数组之和<targe,则right++

所以综上所述,right根本不需要回退到left处,只需要先保持不对,对区间的和判断之后,无非就是先left++,再right++或者直接right++罢了!

所以双指针同向移动,采用滑动窗口来解决即可!

三:代码

①:ret为操作数

class Solution {
public:int minOperations(vector<int>& nums, int x) {int ret=INT_MAX;//ret代表操作数 要返回最小的int targe=0;//查找区间的和int sum=0;//数组的总和for(auto a:nums) sum+=a;targe=sum-x;//计算出窗口的目标和 赋给targeif(targe<0) return -1;//对情况3 x大于整个数组和 进行特判for(int left=0,right=0,total=0;right<nums.size();right++){total+=nums[right];//进窗口while(total>targe)//区间不符合我们的要求{total-=nums[left++];//出窗口}if(total==targe)//符合我们的要求ret=min(ret,(n-(right-left+1)));//则判断更新ret 取最小操作数}return ret==INT_MAX?-1:ret;//有可能ret始终未更新 这就是情况2 反之就是情况1}
};

易错:

①:情况3,x大于整个数组的情况,一定要在执行滑动窗口算法的之前进行特判,否则while循环中的total一定大于targe,这意味着不管你怎么出窗口,你的left会一直++,直到越界,会报错

②:ret代表的是最小操作数,所以博主一开始就取了INT_MAX,其次即使不是情况3,也有可能是情况2,所以ret可能从未被更新,仍为INT_MAX,所以若是为INT_MAX,则返回-1,返回代表情况1,直接返回ret就行

③:像left right toal,这种只需要在循环中用到的变量,直接在for循环定义就行,反之其他的变量,不能再for循环中定义

④:更新结果的前提一定是窗口区间的和total==targe,而不是直接更新

⑤:ret代表操作数,所以我们更新ret的时候,是数组总长度-窗口区间长度得到的

有些写法定义ret为符合要求的窗口区间的长度,所以在返回的时候,有一些变化

②:ret为区间长度

class Solution {
public:int minOperations(vector<int>& nums, int x) {int sum = 0;for (auto a : nums) sum += a;int target = sum - x;// 情况3if (target < 0) return -1;int ret = -1; // 初始化结果为 -1(表示暂时无解)// 滑动窗口:寻找和为 target 的最长子数组for (int left = 0, right = 0, tmp = 0; right < nums.size(); right++) {tmp += nums[right];  // 进窗口while (tmp > target) // 窗口不符合要求tmp -= nums[left++]; // 出窗口if (tmp == target)  // 判断更新ret = max(ret, right - left + 1); // 更新最大窗口长度}// 对情况2特判一下子if (ret == -1) return ret;else return nums.size() - ret;//ret是区间长度 所以操作数应该为总长度减去区间长度}
};

解释:ret是区间长度,所以判断更新的时候轻松一点,但是最后返回的时候麻烦一点

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

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

相关文章

CentOS 7 下通过 Anaconda3 运行llm大模型、deepseek大模型的完整指南

CentOS 7 下通过 Anaconda3 运行llm大模型、deepseek大模型的完整指南A1 CentOS 7 下通过 Anaconda3 运行大模型的完整指南一、环境准备二、创建专用环境三、模型部署与运行四、优化配置常见问题解决B1 CentOS 7 下通过 Anaconda3 使用 CPU 运行 DeepSeek 大模型的完整方案一、…

Flutter应用在Windows 8上正常运行

要让Flutter应用在Windows 8上正常运行,需满足以下前提条件,涵盖系统环境、依赖配置、编译设置等关键环节: 一、系统环境基础要求 Windows 8版本 必须是 Windows 8.1(核心支持),不支持早期Windows 8(需升级到8.1,微软已停止对原版Windows 8的支持)。 确认系统版本:右…

Redis实现消息队列三种方式

参考 Redis队列详解&#xff08;springboot实战&#xff09;_redis 队列-CSDN博客 前言 MQ消息队列有很多种&#xff0c;比如RabbitMQ,RocketMQ,Kafka等&#xff0c;但是也可以基于redis来实现&#xff0c;可以降低系统的维护成本和实现复杂度&#xff0c;本篇介绍redis中实现…

【C++动态版本号生成方案:实现类似C# 1.0.* 的自动构建号】

C动态版本号生成方案&#xff1a;实现类似C# 1.0.* 的自动构建号 在C#中&#xff0c;1.0.*版本号格式会在编译时自动生成构建号和修订号。本文将介绍如何在C项目中实现类似功能&#xff0c;通过MSBuild自动化生成基于编译时间的版本号。 实现原理 版本号构成&#xff1a;主版本…

【算法题】:斐波那契数列

用 JavaScript 实现一个 fibonacci 函数&#xff0c;满足&#xff1a; 输入 n&#xff08;从0开始计数&#xff09;输出第 n 个斐波那契数&#xff08;斐波那契数列从 1 开始&#xff1a;1,1,2,3,5,8,13,21…&#xff09; 示例&#xff1a; fibonacci(0) > 1fibonacci(4) &g…

【YOLOv13[基础]】热力图可视化实践 | 脚本升级 | 优化可视化效果 | 论文必备 | GradCAMPlusPlus, GradCAM, XGradCAM, EigenCAM等

本文将进行添加YOLOv13版本的升级版热力图可视化功能的实践,支持图像热力图可视化、优化可视化效果、 可以选择使用GradCAMPlusPlus, GradCAM, XGradCAM, EigenCAM, HiResCAM, LayerCAM, RandomCAM, EigenGradCAM。一个参数即可设置是否显示检测框等。 原图 结果图

ElasticSearch相关术语介绍

1.RESTful风格程序REST(英文全称为:"Representational State Transfer")指的是一组架构约束条件和原则。它是一种软件架构风格&#xff08;约束条件和原则的集合&#xff0c;但并不是标准&#xff09;。 REST通过资源的角度观察网络&#xff0c;以URI对网络资源进行…

《从零构建大语言模型》学习笔记4,注意力机制1

《从零构建大语言模型》学习笔记4&#xff0c;自注意力机制1 文章目录《从零构建大语言模型》学习笔记4&#xff0c;自注意力机制1前言一、实现一个简单的无训练权重的自注意力机制二、实现具有可训练权重的自注意力机制1. 分步计算注意力权重2.实现自注意力Python类三、将单头…

昇思+昇腾开发板+DeepSeek模型推理和性能优化

昇思昇腾开发板DeepSeek模型推理和性能优化 模型推理 流程&#xff1a; 权重加载 -> 启动推理 -> 效果比较与调优 -> 性能测试 -> 性能优化 权重加载 如微调章节介绍&#xff0c;最终的模型包含两部分&#xff1a;base model 和 LoRA adapter&#xff0c;其中base …

未给任务“Fody.WeavingTask”的必需参数“IntermediateDir”赋值。 WpfTreeView

c#专栏记录&#xff1a; 报错 未给任务“Fody.WeavingTask”的必需参数“IntermediateDir”赋值。 WpfTreeView 生成 解决办法 清理和重新生成项目 完成上述配置后&#xff0c;尝试执行以下步骤&#xff1a; 清理项目&#xff1a;删除 bin 和 obj 文件夹。 重新生成项目&…

[Linux]学习笔记系列 -- [arm][lib]

文章目录arch/arm/lib/delay.cregister_current_timer_delay 注册当前定时器延迟read_current_timer 读取当前定时器drivers/clocksource/timer-stm32.cstm32_clocksource_init STM32 平台上初始化时钟源https://github.com/wdfk-prog/linux-study arch/arm/lib/delay.c regis…

harbor仓库搭建(配置https)

目录 1. 环境准备 2. 配置https的原因 3. 生成ca证书 4. 搭建harbor仓库 5. 访问harbor 6. 修改加密算法 1. 环境准备 需要提前安装docker和docker-compose&#xff0c;harbor仓库版本越新&#xff0c;对应的docker和docker-compose版本越新。 主机IP192.168.48.19dock…

C++多线程服务器

C多线程服务器 因为自己同时在看多本书&#xff0c;之前看过《TCP/IP 网络编程》一书&#xff0c;其中有一个自己编写一个多线程服务器的例子&#xff0c;于是就把代码直接抄了一变。 在学习网络编程前需要先了解网络的7层模型。 具体代码如下&#xff1a; 服务器端&#xff1a…

【Pandas】常用数据处理技巧

一. 数据读取 1.pd.to_csv & pd.read_csv 细节&#xff1a; 1.pd.read_csv 需要 ignore_index True or ,index_col0 否则会有列Unnamed0 2.pickle具有更快的读取速度&#xff0c;与更小的体积。 读取前N行&#xff08;若不需获取所有数据&#xff09; pd.read_csv(…

Docker Compose 部署高可用 MongoDB 副本集集群(含 Keepalived + HAProxy 负载均衡)

Docker Compose 部署高可用 MongoDB 副本集集群&#xff08;含 Keepalived HAProxy 负载均衡&#xff09;背景与目标&#x1f4cb; 环境规划**服务器信息****软件版本**部署步骤1. 创建目录结构2、生成 keyFile&#xff08;三台机器内容必须一致&#xff09;3. 准备 Keepalive…

MySQL(189)如何分析MySQL的锁等待问题?

分析MySQL的锁等待问题有助于发现和解决数据库性能瓶颈。锁等待问题通常会导致数据库响应时间变长&#xff0c;影响系统的整体性能。以下是详细深入的方法和代码示例&#xff0c;帮助你分析和解决MySQL的锁等待问题。 一、锁的类型和概念 在MySQL中&#xff0c;主要有以下几种锁…

26.Scikit-learn实战:机器学习的工具箱

Scikit-learn实战&#xff1a;机器学习的工具箱 &#x1f3af; 前言&#xff1a;机器学习界的"宜家家具" 还记得第一次逛宜家的感受吗&#xff1f;琳琅满目的家具&#xff0c;每一件都有详细的说明书&#xff0c;组装简单&#xff0c;样式统一&#xff0c;关键是—…

wordpress文章摘要调用的3种方法

以下是WordPress文章摘要的3种调用方法&#xff1a; 1. 使用the_excerpt()函数 这是WordPress自带的函数&#xff0c;用于调用文章摘要。如果文章有手动填写的摘要&#xff0c;则会显示手动摘要;如果没有手动摘要&#xff0c;WordPress会自动从文章内容中提取前55个单词作为摘…

java excel转图片常用的几种方法

十分想念顺店杂可。。。在 Java 中实现 Excel 转图片&#xff0c;常用的方法主要分为两类&#xff1a;使用商业库&#xff08;简单高效但可能收费&#xff09;和使用开源库组合&#xff08;免费但实现复杂&#xff09;。以下是几种常用方案及实现思路&#xff1a;一、使用商业库…

QT项目 -仿QQ音乐的音乐播放器(第五节)

目录 一、CommonPage界⾯设置和显示 二、自定义ListItemBox 三、支持hover效果 四、自定义VolumeTool 五、界面设置 六、页面创建及弹出 七、绘制三角 一、CommonPage界面设置和显示 void CommonPage::setCommonPageUI(const QString &title, const QString &imag…