双指针滑动窗口整理1——长度最小的子数组、水果成篮
209. 长度最小的子数组
这篇文章主要是想针对这题 209. 长度最小的子数组,总结一下双指针或是滑动窗口的小细节。对于暴力算法,我们就不再阐释了。
算法原理:
滑动窗口主要是通过控制循环终止节点j,并移动i来缩放窗口。具体而言,当大小为j - i + 1的窗口内所有元素sumnums达到要求sumnums >= target的时候,计算此时的长度是否是达到要求的最小长度 minlen = min(minlen, j - i + 1)。同时,缩小窗口i += 1,继续判断此时的窗口内元素总和的大小。
代码呈现
这里我们使用了两种表示方法,注意观察两者之间的区别。这里我们直接将最小长度minlen赋值为无穷大float('inf')。
方法一:遍历了j,当满足条件sumnums >= target缩小窗口。但是,因为使用了if语句,我们需要把j -= 1,sumnums = sumnums - nums[i] -nums[j]。原因是后面迭代了j += 1且再一次经过条件j < len(nums)时,sumnums += nums[j]。该做法相当于是把缩小后的窗口中总数值是否大于target的判断交给下一次迭代。
方法二:该方法在需要缩小窗口的时候使用了while,即在本次迭代中不断缩小窗口,直到总和小于target,进入下一次迭代。因为停留在本次迭代中(j不变),所以在while循环中不会涉及到j和nums[j]的变化。
两种方法本质上是一样的,只是关于if和while的实现细节容易出错。可以使用target = 5, nums = [1, 1, 1, 1, 4]来作为例子试一试。
第一种
class Solution:def minSubArrayLen(self, target: int, nums: List[int]) -> int:minlen = float('inf')sumnums = 0i = 0j=0while j < len(nums):sumnums += nums[j]if sumnums >= target:minlen = min(minlen, j - i + 1)sumnums = sumnums - nums[i] -nums[j]j -= 1i += 1j += 1return minlen if minlen != float('inf') else 0
第二种
class Solution:def minSubArrayLen(self, target: int, nums: List[int]) -> int:minlen = float('inf')sumnums = 0i = 0j=0for j in range(len(nums)):sumnums += nums[j]while sumnums >= target:minlen = min(minlen, j - i + 1)sumnums = sumnums - nums[i]i += 1return minlen if minlen != float('inf') else 0
904. 水果成篮
对于双指针方法,我们举一反三。 904. 水果成篮
下面对题目进行文字的数学转化:
-
题目中“要尽可能多地收集水果”,表示滑动窗口的大小
maxnums尽可能大。 -
“只有两个篮子,并且每个篮子只能装单一类型的水果”,表示
len(basket) <= 2。每一次通过if fruits[j] not in basket看看在不在篮子里。因为总量没有限制,在就不管,不在篮子里就加入篮子里。 -
“可以选择任意一棵树开始采摘” 表示滑动窗口左边界
i可以随便移动。“每采摘一次,你将会向右移动到下一棵树,并继续采摘。” 表示滑动窗口从左往右移动,是连续的。
注意:
为了方便分析,我们用basket表示篮子里面所装的水果种类,record记录每一种水果种类有多少。为什么要使用record。就是当窗口需要缩小的时候,fruit[i]类型的水果我们不知道在窗口中具体有多少个,所以不能随意地将它pop出篮子。例如,对于fruits = [3,3,3,1,2,1,1,2,3,3,4],在选中basket = [1, 2, 1, 1 ,2]为滑动窗口的时候(此时fruit[j] = 3),我们需要将i = 3向后挪一位(fruit[i] = 1),但后面还要1种类的水果,所以即使往后移动窗口,篮子里面种类还是不变的。
代码如下:
class Solution:def totalFruit(self, fruits: List[int]) -> int:maxnums = 0i = 0basket = [] # 篮子——basket里面只能有两种数字 len(basket) <= 2 record = {} # 需要记录个数for j in range(len(fruits)):if fruits[j] not in basket:basket.append(fruits[j])record[fruits[j]] = 1else:record[fruits[j]] += 1while len(basket) > 2:maxnums = max(maxnums, j - i)if record[fruits[i]] == 1: basket.pop(basket.index(fruits[i]))record[fruits[i]] = 0else:record[fruits[i]] -= 1i += 1maxnums = max(maxnums, j - i + 1)return maxnums
值得一提的是,record和basket可以合二为一,使得代码更简单,这里就不再赘述了。
后面接着整理:双指针滑动窗口整理2——最小覆盖子串。
相关文章:
双指针滑动窗口整理1——长度最小的子数组、水果成篮
209. 长度最小的子数组 这篇文章主要是想针对这题 209. 长度最小的子数组,总结一下双指针或是滑动窗口的小细节。对于暴力算法,我们就不再阐释了。 算法原理: 滑动窗口主要是通过控制循环终止节点j,并移动i来缩放窗口。具体而言…...
textarea之换行、replace、\n、br、innerHTML
文章目录 前言换行符介绍JavaScript部分html部分 前言 textarea标签本身不识别换行功能,回车换行用的是\n换行符,输入时的确有换行的效果,但是渲染时就只是一个空格了。这时就需要利用换行符\n和br标签的转换进行处理。 换行符介绍 表格 序…...
SKD240
SKD240 系列智能电力仪表 SKD240 系列智能电力仪表是陕西斯科德智能科技有限公司自主研发、生产的。 产品概述 - 点击了解详情 SKD240采用先进的微处理器和数字信号处理技术(内置主芯片采用32位单片机, 采用32位浮点型真有效值处理数据),测量…...
大数据采集怎么做呢?
随着互联网的发展,大数据已经成为了一个非常热门的话题。大数据采集是大数据分析的第一步,也是非常重要的一步。本文将介绍大数据采集的基本概念、采集的方法、采集的难点以及采集的注意事项等方面,希望能够对大家有所帮助。 一、大数据采集…...
【学习日记】操作系统-入门知识-个人学习记录
我的学习笔记链接: MyLinuxProgramming 参考资料 CSAPP操作系统导论OSTEP √APUEhttps://stevens.netmeister.org/631软件调试王道-操作系统操作系统真象还原小林coding-图解系统https://xiaolincoding.com嵌入式软件开发笔试面试指南Linux是怎样工作的2020 南京大…...
ChatGPT自动生成思维导图
🍏🍐🍊🍑🍒🍓🫐🥑🍋🍉 ChatGPT自动生成思维导图 文章目录 🍐问题引入🍐具体操作markmapXmind 🐳结语 …...
count(0)、count(1)和count(*)、count(列名) 的区别
当我们对一张数据表中的记录进行统计的时候,习惯都会使用 count 函数来统计,但是 count 函数传入的参数有很多种,比如 count(1)、count(*)、count(字段) 等。 到底哪种效率是最好的呢?是不是 count(*) 效率最差? 一.…...
python爬虫入门,10分钟就够了,这可能是我见过最简单的基础教学
一、基础入门 1.1什么是爬虫 爬虫(spider,又网络爬虫),是指向网站/网络发起请求,获取资源后分析并提取有用数据的程序。 从技术层面来说就是 通过程序模拟浏览器请求站点的行为,把站点返回的HTML代码/JSON数据/二进制数据&…...
华为OD机试真题 Java 实现【记票统计】【牛客练习题】
一、题目描述 请实现一个计票统计系统。你会收到很多投票,其中有合法的也有不合法的,请统计每个候选人得票的数量以及不合法的票数。 (注:不合法的投票指的是投票的名字不存在n个候选人的名字中!!) 数据范围:每组输入中候选人数量满足 1≤n≤100 ,总票数量满足 1≤…...
.NET并行计算
一段很简答的,模拟多任务并发的测试代码。 private void button_Click(object sender, EventArgs e) { List<Action> actions new List<Action>(); for (int i 0; i < 30; i) { //匿…...
Python:Python编程:金融量化交易
金融量化交易 1. numpy2. scipy3. Pandas3.1 : Series 3.2: DataFrame代码示例 在金融量化交易中,下面几个模块是应用的比较广泛的 numpy (Numberic Python) : 提供大量的数值编程工具,可以方便的处理:向量矩阵等运算,…...
「HTML和CSS入门指南」canvas 标签详解
什么是 canvas 标签? 在 HTML 中,canvas 标签用于在网页中绘制图形、动画和其他复杂的视觉效果。它是一个独立的标签,并且可以使用 JavaScript 来操纵和渲染其内容。使用 canvas 标签可以帮助您创造交互性更强、生动更具吸引力的用户界面和体验。 canvas 标签的基本语法 以…...
【JS】1699- 重学 JavaScript API - WebSockets API
❝ 前期回顾: 1. Page Visibility API 2. Broadcast Channel API 3. Beacon API 4. Resize Observer API 5. Clipboard API 6. Fetch API 7. Performance API 8. Web Storage API ❞ WebSockets API 提供了一种在客户端和服务器之间建立持久连接的机制,使…...
String s = new String(“xyz“) 创建了几个对象?
这个问题相信每个学习 java 的同学都不陌生,作为一个经典的面试题,到现在工作这么多年了我真是认为挺操蛋的一个问题,在网上到现在你仍然可以看见很多讨论这个问题的人,其中不乏工作很多年的人都有争论,我认为还是有必…...
STL库(1)
STL库(1) vectorvector介绍vector使用初始化元素访问内存扩容插入删除 listlist介绍初始化,元素访问插入删除元素 vector和list区别 vector vector介绍 vector是可以改变大小的数组的容器。其内存结构和数组一样,使用连续的存储…...
玻璃制品行业丨外贸业务管理难点及解决方案
玻璃作为一种重要的建筑材料,在国际贸易中一直占有一定的份额。随着国外市场需求量的不断增加,对玻璃制品的技术含量要求越来越高,需要在研发方面的投入也逐步加大。由于国际市场竞争激烈,想要做玻璃制品行业的外贸公司࿰…...
Spring Boot如何实现自定义Spring Boot启动器
Spring Boot如何实现自定义Spring Boot启动器 在Spring Boot中,启动器(Starter)是一组依赖项的集合,它们一起提供了某个特定的功能。使用Spring Boot启动器可以让我们更加方便地集成第三方库和框架,并且可以避免版本冲…...
【面试题HTTP中的两种请求方法】GET 和 POST 有什么区别?
GET 和 POST 有什么区别? 1.相同点和最本质的区别1.1 相同点1.2 最本质的区别 2.非本质区别2.1 缓存不同2.2 参数长度限制不同2.3 回退和刷新不同2.4 历史记录不同2.5 书签不同 总结代码示例 GET 和 POST 是 HTTP 请求中最常用的两种请求方法,在日常开发…...
Allegro16.6详细教程(三)
確定Pad的層面 (1)用Single layer mode開關來控制pad type 勾選Single layer mode,則pad為單面孔,比如SMD 不勾選Single layer mode,則pad為通孔,比如:via (2)用滑鼠左鍵點選BEGIN LAYER彈出下面3個欄位 Regular, Thermal Relief, Anti Pad;Regular用於正片,Thermal R…...
Python3数据分析与挖掘建模(6)离散分布分析示例
1. 离散分布分析示例 相关库: pandas详细用法 numpy详细用法 1.1 引入算法库 # 引入 pandas库 import pandas as pd # 引入 numpy库 import numpy as np# 读取数据 dfpd.read_csv("data/HR.csv")# 查看数据 df Out[6]: satisfaction_level last_eval…...
Xshell远程连接Kali(默认 | 私钥)Note版
前言:xshell远程连接,私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...
Unity3D中Gfx.WaitForPresent优化方案
前言 在Unity中,Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染(即CPU被阻塞),这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案: 对惹,这里有一个游戏开发交流小组&…...
阿里云ACP云计算备考笔记 (5)——弹性伸缩
目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...
镜像里切换为普通用户
如果你登录远程虚拟机默认就是 root 用户,但你不希望用 root 权限运行 ns-3(这是对的,ns3 工具会拒绝 root),你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案:创建非 roo…...
BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践
6月5日,2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席,并作《智能体在安全领域的应用实践》主题演讲,分享了在智能体在安全领域的突破性实践。他指出,百度通过将安全能力…...
鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/
使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题:docker pull 失败 网络不同,需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...
Angular微前端架构:Module Federation + ngx-build-plus (Webpack)
以下是一个完整的 Angular 微前端示例,其中使用的是 Module Federation 和 npx-build-plus 实现了主应用(Shell)与子应用(Remote)的集成。 🛠️ 项目结构 angular-mf/ ├── shell-app/ # 主应用&…...
云原生玩法三问:构建自定义开发环境
云原生玩法三问:构建自定义开发环境 引言 临时运维一个古董项目,无文档,无环境,无交接人,俗称三无。 运行设备的环境老,本地环境版本高,ssh不过去。正好最近对 腾讯出品的云原生 cnb 感兴趣&…...
Go 语言并发编程基础:无缓冲与有缓冲通道
在上一章节中,我们了解了 Channel 的基本用法。本章将重点分析 Go 中通道的两种类型 —— 无缓冲通道与有缓冲通道,它们在并发编程中各具特点和应用场景。 一、通道的基本分类 类型定义形式特点无缓冲通道make(chan T)发送和接收都必须准备好࿰…...
Netty从入门到进阶(二)
二、Netty入门 1. 概述 1.1 Netty是什么 Netty is an asynchronous event-driven network application framework for rapid development of maintainable high performance protocol servers & clients. Netty是一个异步的、基于事件驱动的网络应用框架,用于…...
