当前位置: 首页 > news >正文

【算法一周目】滑动窗口(1)

目录

长度最小的子数组

解题思路

代码实现

无重复字符的最大字串

解题思路

代码实现

最大连续1的个数l l l

解题思路

代码实现

将x减到0的最小操作数

解题思路

代码实现


长度最小的子数组

题目链接:209. 长度最小的子数组
题目描述:
给定一个含有 n 个正整数数组 nums 和一个正整数 target
找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl+1, ..., numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0

解题思路

解法一:暴力求解

枚举所有可能的子数组,计算子数组的和,检查是否大于等于 target ,找到符合题目要求的长度最小的子数组。

​
​
class Solution {
public:int minSubArrayLen(int target, vector<int>& nums) {int n = nums.size();int ret = INT_MAX;for (int left = 0; left < n; ++left) {int sum = 0;for (int right = left; right < n; ++right) {sum += nums[right];if (sum >= target) {ret = min(ret, right - left + 1);break;}}}return ret == INT_MAX ? 0 : ret;}
};​​

暴力解法简单粗暴,但是由于时间复杂度是 O(n ^ 2),一旦数据量比较大,必定会超时

解法二:滑动窗口

滑动窗口其实也是基于暴力解法优化而来,滑动窗口的核心就是想办法让暴力解法中的 right 指针不回退,一直往前走

我们想想这样一个问题,在暴力解法中,当left和right找到一个合法的子数组后,left++,right有必要回退到left位置吗?答案是没有必要的,当left++后left和right区间的子数组的和可能大于等于target,也可能小于target。我们可以让left一直++,并在此过程中记录区间长度,直到left和right区间的子数组的和小于target,然后再让right++,增大区间长度的和,重复上述过程,直到遍历完数组。

滑动窗口具体过程如下:

  • 1.初始化left和right指针为0。
  • 2.进窗口:计算区间的和
  • 3.判断
  • 当区间和大于等于target时,找到合法区间,更新结果出窗口:让left++,重复判断-更新结果过程,直到区间和小于target;
  • 当区间和小于target时,进窗口:让right++,计算区间和。
  • 4.重复上述过程,直到right遍历完数组

值得注意的是,更新结果这步不是固定的,有时候在判断时更新,有时候在判断完后再更新。

代码实现

class Solution {
public:int minSubArrayLen(int target, vector<int>& nums) {int sum = 0, n = nums.size(), len = INT_MAX;for(int left = 0, right = 0; right < n; right++){sum += nums[right];while(sum >= target){len = min(len, right - left + 1);sum -= nums[left++];}}return len == INT_MAX ? 0 : len;}
};

细节:由于求的是长度最小的子数组,所以len要初始化为INT_MAX,不能初始化为0。

时间复杂度:O(n)

空间复杂度:O(1)

无重复字符的最大字串

题目链接:3. 无重复字符的最长子串
题目描述
给定一个字符串 s,请你找出其中不含有重复字符的最长子串的长度

解题思路

解法一:暴力求解

​​​通过枚举从每个位置开始,向后寻找无重复字符的子串能到达的位置,记录其中最长的子串长度即可。在寻找无重复子串时,可以使用哈希表统计字符出现的频次,遇到重复字符时停止。​​​​

class Solution {
public:int lengthOfLongestSubstring(string s) {int ret = 0;  // 记录结果int n = s.length();// 枚举从不同位置开始的无重复子串for (int i = 0; i < n; i++) {int hash[128] = { 0 };  // 记录字符频次for (int j = i; j < n; j++) {hash[s[j]]++;  // 统计字符频次if (hash[s[j]] > 1)  // 出现重复,终止break;ret = max(ret, j - i + 1);  // 更新结果}}return ret;}
};

暴力求解的问题还是时间复杂度是O(n),对于处理数据量比较大的数据时会超时。

解法二:滑动窗口

使用滑动窗口,使得窗口内的字符不重复。

当窗口右端进入新字符时,更新哈希表记录字符频次:

  • 如果字符频次大于1,则窗口出现重复字符,开始从左侧收缩窗口直到字符频次变为1,更新结果
  • 如果没有超过1,说明没有重复字符,直接更新结果

代码实现

class Solution {
public:int lengthOfLongestSubstring(string s) {int hash[128] = { 0 };  // 使用数组模拟哈希表int left = 0, right = 0, n = s.size(), len = 0;while(right < n){hash[s[right]]++;  // 将右端字符加入窗口while(hash[s[right]] > 1)  //判断hash[s[left++]]--;      //出窗⼝//更新结果len = max(len, right - left + 1); //让下⼀个元素进⼊窗⼝right++;    }return len;}
};

细节:由于s由英文字母、数字、符号和空格组成,不必真的使用unordered_map,用一个128大小的数组当作哈希表即可。

时间复杂度:O(n)

空间复杂度:O(1)

最大连续1的个数l l l

题目链接:1004. 最大连续 1 的个数 III
题目描述
给定一个二进制数组 nums 和一个整数 k,如果可以翻转最多 k 个0,则返回数组中连续 1的最大个数。

解题思路

根据题目描述,我们可以将其转换为求一段最长的连续子区间其中0的数量不超过k个,我们用滑动窗口解决。

  • 1.初始化左右指针left和right,以及记录0个数的变量cnt。
  • 2.当right向右遍历数组时:
  • 如果当前元素是0,cnt++
  • 然后判断cnt是否大于cnt大于则让left++缩减窗口移除窗口中的0直到cnt小于等于k。
  • 3。此时窗口合法更新结果。

代码实现

class Solution {
public:int longestOnes(vector<int>& nums, int k) {int ret = 0, cnt = 0, n = nums.size();for(int left = 0, right = 0; right < n; right++){if(nums[right] == 0) cnt++; //当前元素为0,cnt++//当cnt > k时,移除窗口中的0,直到cnt <= kwhile(cnt > k){if(nums[left] == 0)cnt--;left++;    }//更新结果ret = max(ret, right - left + 1);}return ret;}
};

时间复杂度:O(n)

空间复杂度:O(1)

将x减到0的最小操作数

题目链接:1658. 将 x 减到 0 的最小操作数

题目描述:
给你一个整数数组 nums一个整数 x每次操作时,你可以移除数组 nums 的最左边或最右边的元素,然后从 x 中减去该元素的值。请注意,你需要修改数组以供接下来的操作使用。如果可以将 x 恰好减到 0返回最少的操作数;否则,返回 -1

解题思路

解法:滑动窗口

题目要求的是在数组左端、右端找两段连续且和为x的短数组,我们可以将其转换为在数组中找到和为 sum - x 的最长子数组,其剩余数组长度就是最小操作数,可以使用滑动窗口解决问题。

具体过程如下:

  • 1.计算数组的和 sum ,然后求出target = sum - x。这里有个小细节,若target < 0说明x > sum不可能找到题目要求的最小操作数直接返回-1
  • 2.初始化 left 和 righ t两个指针为0,再用一个变量 part_sum 记录区间长度的和。
  • 3.当 part_sum > target 时减小 part_sum,left++直到 part_sum <= target
  • 4.如果 part_sum == target更新最长子数组的长度
  • 5.right++,增大 part_sum。
  • 循环上述过程,直到 right 遍历完数组。

代码实现

class Solution {
public:int minOperations(vector<int>& nums, int x) {//1.计算数组总和int n = nums.size(), sum = 0;for(auto e : nums) sum += e;int len = -1, target = sum - x, part_sum = 0;if(target < 0) return -1;//2.使用滑动窗口求出符合条件的最大子数组和for(int left = 0, right = 0; right < n; right++){part_sum += nums[right];while(left < n && part_sum > target)part_sum -= nums[left++];if(part_sum == target)len = max(len, right - left + 1);}return len == -1 ? -1 : n - len;}
};

拜拜,下期再见😏

摸鱼ing😴✨🎞

相关文章:

【算法一周目】滑动窗口(1)

目录 长度最小的子数组 解题思路 代码实现 无重复字符的最大字串 解题思路 代码实现 最大连续1的个数l l l 解题思路 代码实现 将x减到0的最小操作数 解题思路 代码实现 长度最小的子数组 题目链接&#xff1a;209. 长度最小的子数组题目描述&#xff1a; 给定一个…...

React Native 基础

React 的核心概念 定义函数式组件 import组件 要定义一个Cat组件,第一步要使用 import 语句来引入React以及React Native的 Text 组件: import React from react; import { Text } from react-native; 定义函数作为组件 const CatApp = () => {}; 渲染Text组件...

【C++笔记】list使用详解及模拟实现

前言 各位读者朋友们大家好&#xff01;上期我们讲了vector的使用以及底层的模拟实现&#xff0c;这期我们来讲list。 目录 前言一. list的介绍及使用1.1 list的介绍1.2 list的使用1.2.1 list的构造1.2.2 list iterator的使用1.2.3 list capacity1.2.4 list element access1.…...

【机器学习】机器学习中用到的高等数学知识-7.信息论 (Information Theory)

熵 (Entropy)&#xff1a;用于评估信息的随机性&#xff0c;常用于决策树和聚类算法。交叉熵 (Cross-Entropy)&#xff1a;用于衡量两个概率分布之间的差异&#xff0c;在分类问题中常用。 信息论作为处理信息量和信息传输的数学理论&#xff0c;在机器学习中具有广泛的应用。…...

《现代制造技术与装备》是什么级别的期刊?是正规期刊吗?能评职称吗?

​问题解答 问&#xff1a;《现代制造技术与装备》是不是核心期刊&#xff1f; 答&#xff1a;不是&#xff0c;是知网收录的第二批认定学术期刊。 问&#xff1a;《现代制造技术与装备》级别&#xff1f; 答&#xff1a;省级。主管单位&#xff1a;齐鲁工业大学&#xff0…...

09 - Clickhouse的SQL操作

目录 1、Insert 1.1、标准 1.2、从表到表的插入 2、Update和Delete 2.1、删除操作 2.2、修改操作 3、查询操作 3.1、with rollup&#xff1a;从右至左去掉维度进行小计 3.2、with cube : 从右至左去掉维度进行小计&#xff0c;再从左至右去掉维度进行小计 3.3、with …...

如何解决pdf.js跨域从url动态加载pdf文档

摘要 当我们想用PDF.js从URL加载文档时&#xff0c;将会因遇到跨域问题而中断&#xff0c;且是因为会触发了PDF.js和浏览器的双重CORS block&#xff0c;这篇文章将会介绍&#xff1a;①如何禁用pdf.js的跨域&#xff1f;②如何绕过浏览器的CORS加载URL文件&#xff1f;②如何使…...

深入理解TTY体系:设备节点与驱动程序框架详解

往期内容 本专栏往期内容&#xff1a;Uart子系统 UART串口硬件介绍 interrupt子系统专栏&#xff1a; 专栏地址&#xff1a;interrupt子系统Linux 链式与层级中断控制器讲解&#xff1a;原理与驱动开发 – 末片&#xff0c;有专栏内容观看顺序 pinctrl和gpio子系统专栏&#xf…...

库的操作(MySQL)

1.创建数据库 语法&#xff1a; CREATE DATABASE [IF NOT EXISTS] db_name [create_specification [, create_specification] ...] create_specification:[DEFAULT] CHARACTER SET charset_name[DEFAULT] COLLATE collation_name说明&#xff1a; 大写的表示关键字 [ ] 是可…...

在 for 循环中,JVM可能会将 arr.length 提升到循环外部,仅计算一次。可能会将如何解释 详解

在 Java 的 for 循环中&#xff0c;JVM 有能力进行优化&#xff0c;将 arr.length 的访问提升到循环外部&#xff0c;避免每次迭代都重新计算 arr.length。这种优化主要是由于 JVM 的 即时编译器&#xff08;JIT&#xff09; 和 逃逸分析&#xff08;Escape Analysis&#xff0…...

回溯--数据在内存中的存储:整数、大小端和浮点数的深度解析

目录 引言 1. 整数在内存中的存储 1.1 原码、反码和补码 1.2 为什么使用补码&#xff1f; 1.3 示例代码&#xff1a;整数的存储 2. 大小端字节序和字节序判断 2.1 什么是大端和小端&#xff1f; 2.2 为什么会有大端和小端之分&#xff1f; 2.3 字节序的判断小程序 2.…...

第二十二章 Spring之假如让你来写AOP——Target Object(目标对象)篇

Spring源码阅读目录 第一部分——IOC篇 第一章 Spring之最熟悉的陌生人——IOC 第二章 Spring之假如让你来写IOC容器——加载资源篇 第三章 Spring之假如让你来写IOC容器——解析配置文件篇 第四章 Spring之假如让你来写IOC容器——XML配置文件篇 第五章 Spring之假如让你来写…...

探索设计模式:原型模式

设计模式之原型模式 &#x1f9d0;1. 概念&#x1f3af;2. 原型模式的作用&#x1f4e6;3. 实现1. 定义原型接口2. 定义具体的原型类3. 定义客户端4. 结果 &#x1f4f0; 4. 应用场景&#x1f50d;5. 深拷贝和浅拷贝 在面向对象编程中&#xff0c;设计模式是一种通用的解决方案…...

NLP论文速读(EMNLP 2023)|工具增强的思维链推理

论文速读|ChatCoT: Tool-Augmented Chain-of-Thought Reasoning on Chat-based Large Language Models 论文信息&#xff1a; 简介&#xff1a; 本文背景是关于大型语言模型&#xff08;LLMs&#xff09;在复杂推理任务中的表现。尽管LLMs在多种评估基准测试中取得了优异的成绩…...

JVM垃圾回收详解.②

空间分配担保 空间分配担保是为了确保在 Minor GC 之前老年代本身还有容纳新生代所有对象的剩余空间。 《深入理解 Java 虚拟机》第三章对于空间分配担保的描述如下&#xff1a; JDK 6 Update 24 之前&#xff0c;在发生 Minor GC 之前&#xff0c;虚拟机必须先检查老年代最大…...

什么是事务,事务有什么特性?

事务的四大特性&#xff08;ACID&#xff09; 原子性&#xff08;Atomicity&#xff09; 解释&#xff1a;原子性确保事务中的所有操作要么全部完成&#xff0c;要么全部不做。这意味着事务是一个不可分割的工作单元。在数据库中&#xff0c;这通常通过将事务的操作序列作为一个…...

深入解析:如何使用 PyTorch 的 SummaryWriter 进行深度学习训练数据的详细记录与可视化

深入解析&#xff1a;如何使用 PyTorch 的 SummaryWriter 进行深度学习训练数据的详细记录与可视化 为了更全面和详细地解释如何使用 PyTorch 的 SummaryWriter 进行模型训练数据的记录和可视化&#xff0c;我们可以从以下几个方面深入探讨&#xff1a; 初始化 SummaryWriter…...

企业微信中设置回调接口url以及验证 spring boot项目实现

官方文档&#xff1a; 接收消息与事件&#xff1a; 加密解密文档&#xff1a;加解密库下载与返回码 - 文档 - 企业微信开发者中心 下载java样例 加解密库下载与返回码 - 文档 - 企业微信开发者中心 将解压开的代码 ‘将文件夹&#xff1a;qq\weixin\mp\aes的代码作为工具拷…...

电脑超频是什么意思?超频的好处和坏处

嗨&#xff0c;亲爱的小伙伴&#xff01;你是否曾经听说过电脑超频&#xff1f;在电脑爱好者的圈子里&#xff0c;这个词似乎非常熟悉&#xff0c;但对很多普通用户来说&#xff0c;它可能还是一个神秘而陌生的存在。 今天&#xff0c;我将带你揭开超频的神秘面纱&#xff0c;…...

在 AMD GPU 上构建深度学习推荐模型

Deep Learning Recommendation Models on AMD GPUs — ROCm Blogs 2024 年 6 月 28 日 发布者 Phillip Dang 在这篇博客中&#xff0c;我们将演示如何在支持 ROCm 的 AMD GPU 上使用 PyTorch 构建一个简单的深度学习推荐模型 (DLRM)。 简介 DLRM 位于推荐系统和深度学习的交汇…...

阿里云IIS虚拟主机部署ssl证书

宝塔配置SSL证书用起来是很方便的&#xff0c;只需要在站点里就可以配置好&#xff0c;但是云虚拟主机在管理的时候是没有这个权限的&#xff0c;只提供了简单的域名管理等信息。 此处记录下阿里云&#xff08;原万网&#xff09;的IIS虚拟主机如何配置部署SSL证书。 进入虚拟…...

Python运算符列表

运算符 描述 xy&#xff0c;x—y 加、减,“"号可重载为连接符 x*y,x*&#xff0a;y&#xff0c;x/y,x&#xff05;y 相乘、求平方、相除、求余&#xff0c;“*”号可重载为重复&#xff0c;“&#xff05;"号可重载为格式化 <&#xff0c;<&#xff0c;&…...

MFC图形函数学习09——画多边形函数

这里所说的多边形是指在同一平面中由多条边构成的封闭图形&#xff0c;强调封闭二字&#xff0c;否则无法进行颜色填充&#xff0c;多边形包括凸多边形和凹多边形。 一、绘制多边形函数 原型&#xff1a;BOOL Polygon(LPPOINT lpPoints,int nCount); 参数&#x…...

GaussianDreamer: Fast Generation from Text to 3D Gaussians——点云论文阅读(11)

此内容是论文总结&#xff0c;重点看思路&#xff01;&#xff01; 文章概述 本文提出了一种快速从文本生成3D资产的新方法&#xff0c;通过结合3D高斯点表示、3D扩散模型和2D扩散模型的优势&#xff0c;实现了高效生成。该方法利用3D扩散模型生成初始几何&#xff0c;通过噪声…...

k8s篇之控制器类型以及各自的适用场景

1. k8s中控制器介绍 在 Kubernetes 中,控制器(Controller)是集群中用于管理资源的关键组件。 它们的核心作用是确保集群中的资源状态符合用户的期望,并在需要时自动进行调整。 Kubernetes 提供了多种不同类型的控制器,每种控制器都有其独特的功能和应用场景。 2. 常见的…...

Node.js 笔记(一):express路由

代码 建立app.js文件&#xff0c;代码如下&#xff1a; const express require(express) const app express() const port 3002app.get(/,(req,res)>{res.send(hello world!)})app.listen(port,()>{console.log(sever is running on http://localhost:${port}) })问…...

bash笔记

0 $0 是脚本的名称&#xff0c;$# 是传入的参数数量&#xff0c;$1 是第一个参数&#xff0c;$BOOK_ID 是变量BOOK_ID的内容 1 -echo用于在命令窗口输出信息 -$()&#xff1a;是命令替换的语法。$(...) 会执行括号内的命令&#xff0c;并将其输出捕获为一个字符串&#xff…...

mongoDB副本集搭建-docker

MongoDB副本集搭建-docker 注&#xff1a;在进行副本集搭建前&#xff0c;请先将服务部署docker环境并正常运行。 #通过--platform指定下载镜像的系统架构 在这我用的是mongo:4.0.28版本 arm64系统架构的mongo镜像 docker pull --platformlinux/arm64 mongo:4.0.2#查看镜像是…...

Python软体中使用 Flask 或 FastAPI 搭建简单 RESTful API 服务并实现限流功能

Python软体中使用 Flask 或 FastAPI 搭建简单 RESTful API 服务并实现限流功能 引言 在现代 web 开发中,RESTful API 已成为应用程序之间进行通信的标准方式。Python 提供了多种框架来帮助开发者快速搭建 RESTful API 服务,其中 Flask 和 FastAPI 是最受欢迎的两个框架。本…...

CentOS操作系统下安装Nacos

CentOS下安装Nacos 前言 这在Centos下安装配置Nacos 下载Linux版Nacos 首先到Nacos的 Github页面&#xff0c;找到所需要安装的版本 也可以右键复制到链接&#xff0c;然后通过wget命令进行下载 wget https://github.com/alibaba/nacos/releases/download/1.3.2/nacos-ser…...

松江新城做网站公司/手机百度账号申请注册

只能数字&#xff1a; /^[0-9]$/g只能中文&#xff1a;/^[\u4e00-\u9fa5]*$/只能英文&#xff1a;/^[A-Za-z]$/只能中文或英文&#xff1a;/^[\u4e00-\u9fa5a-zA-Z]*$/禁止输入中文&#xff1a; /[^\u4e00-\u9fa5]/只能英文和数字&#xff1a;/^[A-Za-z0-9]$/只能中文、数字、英…...

如何自己学建设网站/怎样在百度上发布自己的文章

链式调用和分步式调用现代敏捷开发实践的两个关键思想。 首先&#xff0c; 整个团队可以更有效地完成这项工作&#xff0c;在整个团队中&#xff0c;人们可以协同工作以设计和构建系统。 他们共享代码&#xff0c;互相检查工作&#xff0c;共享想法&#xff0c;问题和解决方案&…...

物流公司网站制作模板/建立一个企业网站需要多少钱

try catch-当try块里发生错误时&#xff0c;catch块就会被执行 finally-用来执行一些清理代码&#xff0c;无论是否有错误发生 catch块-对错误进行处理/重新抛出异常 finally块总是会被执行 可以有多个catch&#xff0c;每个catch会捕获特定类型的异常 catch子句指定了要捕获…...

日本软银集团最大股东是谁/关键词优化排名网站

SSIS(SQL Server Integration Service)是从MS SQL 2005开始引入的&#xff0c;是一种ETL&#xff08;Extract Transform Load&#xff09;工具&#xff0c;SSIS比普通的ETL更进一步&#xff0c;它是可视化的&#xff0c;用Visual Studio来开发&#xff0c;包文件(*.dtsx)采用的…...

企业形象型网站建设/百度seo排名点击

网络模型&#xff1a; C/S和B/S的区别&#xff0c;主要以下部分&#xff1a; &#xff08;a&#xff09;硬件要求不同&#xff0c;C/S一般建立在专用的网络上&#xff0c;是小范围的网络环境&#xff1b;而B/S一般构建在广域网上&#xff0c;不需要专门的网络硬件环境&#xff…...

做二维码的网站/北京建站工作室

文章目录SSH连接GitHub并配置ssh key一、设置Git的user name和email二、本地生成ssh key1、检查ssh keys是否存在2、生成ssh key3、将ssh key添加到ssh-agent三、配置git的ssh key1、将ssh key配置到github2、测试ssh key的配置情况SSH连接GitHub并配置ssh key 配置git的ssh提…...