python算法与数据结构---滑动窗口双指针

学习目标

  • 了解滑动窗口的基本原理;
  • 学会用使用python语言解答滑动窗口经典题目;
  • 了解双指针的基本原理;
  • 学会使用python语言解答双指针经典题目;

滑动窗口

209. 长度最小的子数组

https://leetcode.cn/problems/minimum-size-subarray-sum/description/
在这里插入图片描述

暴力解法

  • 目标是找子数组,暴力遍历所有的子数组

  • 枚举子数组的下标i,对于每个开始下标i:

    • 枚举子数组的结束下标j(i<=j)
    • 使得nums[i]到nums[j]的元素和大于等于s
    • 更新子数组的最小长度(j-i+1)
  • 优化点:

    • 前提:nums数组中全是正整数
    • 枚举子数组的结束下标时,如果nums[i]到nums[j]的元素和大于等于s时,中断对结束下标的枚举
class Solution:def minSubArrayLen(self, target: int, nums: List[int]) -> int:if not nums:return 0n = len(nums)ans = n + 1# 枚举子数组的开始下标i;for i in range(n):total = 0# 枚举子数组的结束下标jfor j in range(i, n):total += nums[j]# 更新子数组的最小长度(j-i+1)if total >= target:ans = min(ans, j - i + 1)breakif ans == n + 1:return 0else:return ans

滑动窗口

  • 定义两个指针start和end分别表示子数组(滑动窗口)的开始位置和结束位置,初始状态下都指向下标0;
  • 维护变量total存储子数组中的元素和(即从nums[start]到nums[end]的元素和)
  • 迭代:
    • 滑动窗口终止位置移动:在每一轮迭代的最后,将end右移,将nums[end]加到total
    • 滑动窗口起始位置移动:若total>=s,则更新子数组最小长度end-start+1,然后将nums[start]从total中减去并将start右移,直到total<s,同时不断更新子数组的最小长度
class Solution:def minSubArrayLen(self, target: int, nums: List[int]) -> int:if not nums:return 0n = len(nums)ans = n + 1# 滑动窗口的开始位置和结束位置start, end = 0, 0total = 0 while end < n:total += nums[end]while total >= target:ans = min(ans, end - start + 1)total -= nums[start]# 滑动窗口起始位置移动start += 1# 滑动窗口终止位置移动end += 1if ans == n + 1:return 0else:return ans

滑动窗口图解

在这里插入图片描述

  • 扩张窗口:为了找到一个可行解,找到了就不再扩张,因为扩张不再有意义;
  • 收缩窗口:在长度上优化该可行解,直到条件被破坏;
  • 继续寻找下一个可行解,然后再优化到不能优化

567. 字符串的排列

https://leetcode.cn/problems/permutation-in-string/description/
在这里插入图片描述
题目建模:

  • 无需全排列:排列不会改变字符串中每个字符的个数,所以只有两个字符串每个字符的个数均相等时,一个字符串才是另一个字符串的排列
  • 建模:s1的每个字符出现的次数,与s2某个子串的每种字符出现次数相同。

滑动窗口解法

  • 维护两个数组dic1和dic2,其中dic1用于统计s1中各个字符的个数,dic2用于统计当前遍历子串中的各个字符的个数;
  • 由于需要遍历的子串长度均为m1,我们可以使用一个固定长度为m1的滑动窗口来维护dic2;
  • 滑动窗口每向右滑动一次,就多统计一次进入窗口的字符,少统计一次离开窗口的字符。然后,判断dic1是否与dic2相等,若相等则意味着当前窗口内的子串是s1的排列之一。
class Solution:def checkInclusion(self, s1: str, s2: str) -> bool:m1 = len(s1)m2 = len(s2)if m1 > m2:return False# 采用有序字典来比较,由于只包含小写字母,采用数组来模拟有序字典dic1 = [0] * 26dic2 = [0] * 26# 滑动窗口长度固定为m1for i in range(m1):dic1[ord(s1[i]) - ord('a')] += 1dic2[ord(s2[i]) - ord('a')] += 1if dic1 == dic2:return True# 滑动窗口每向右滑动一次,就多统计一次进入窗口的字符,少统计一次离开窗口的字符for i in range(m1, m2):dic2[ord(s2[i-m1]) - ord('a')] -= 1dic2[ord(s2[i]) - ord('a')] += 1if dic1 == dic2:return Truereturn False

双指针

  • 滑动窗口有本质上是双指针,窗口的开始位置和结束位置便是两个指针,窗口的滑动对应指针的移动;
  • 双指针有时也叫快慢指针,在数组里是用两个整型代表下标,在链表里面是两个指针,一般能将O(N^2)的时间复杂度降为O(N);
  • 两个指针的位置一般在第一个元素和第二个元素或者第一个元素和最后一个元素,快指针在前“探路”,当符合某种条件快慢指针向前挪动。
  • 同向双指针,在同向双指针套路中,两个指针朝相同方向移动,但是快慢不同。
  • 反向双指针, 反向双指针中的两个指针反向而行。

11. 盛最多水的容器

https://leetcode.cn/problems/container-with-most-water/description/
在这里插入图片描述

双指针解法

  • 指针每一次移动,都意味着排除掉一根柱子;
  • 如何确定排除哪一根柱子。
    在这里插入图片描述
class Solution:def maxArea(self, height: List[int]) -> int:#双指针"""1、设置两个指针,一个指向起始位置,一个指向末尾,则s = min(h[i],h[j])*(j-i);2、指针向内移动,移动高板,则面积肯定减少;3、移动矮板,面积可能增加4、直至指针相遇,返回面积最大值"""#coding i, j = 0, len(height)-1area = 0ans = 0while i < j:area = min(height[i],height[j]) * (j-i)ans = max(area,ans)if height[i] < height[j]:i += 1else:j -= 1return ans

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

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

相关文章

Unity 中介者模式 (实例详解)

文章目录 简介实例1&#xff1a;玩家与UI交互实例2&#xff1a;战斗模块中的攻击事件协调实例3&#xff1a;游戏场景中的事件广播实例4&#xff1a;模块间通信 - 地图导航与角色移动实例5&#xff1a;UI模块间同步 - 菜单切换与选项状态 简介 在Unity游戏开发中&#xff0c;中…

初识K8S(Kubernetes )

一、概述 Kubernetes 是一个可移植、可扩展的开源平台&#xff0c;用于管理容器化的工作负载和服务&#xff0c;可促进声明式配置和自动化。 Kubernetes 拥有一个庞大且快速增长的生态&#xff0c;其服务、支持和工具的使用范围相当广泛。&#xff08;官网&#xff09; Kuberne…

Go语言基础之接口

接口类型 一个接口类型就是一组方法的集合&#xff0c;它规定了需要实现的所有方法。 接口的定义 每个接口类型由任意个方法签名组成&#xff0c;接口的定义格式如下&#xff1a; type 接口类型名 interface{方法名1( 参数列表1 ) 返回值列表1方法名2( 参数列表2 ) 返回值列…

【开源】基于JAVA+Vue+SpringBoot的智慧家政系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块三、系统展示四、核心代码4.1 查询家政服务4.2 新增单条服务订单4.3 新增留言反馈4.4 小程序登录4.5 小程序数据展示 五、免责说明 一、摘要 1.1 项目介绍 基于微信小程序JAVAVueSpringBootMySQL的智慧家政系统&#xff0…

Qt项目文件以及对象树

"在哪里走散&#xff0c;你都会找到我~" 前篇&#xff0c;我们仅仅对Qt创建了第一个简单的项目。相比于使用其他IDE创建工程项目&#xff0c;Qt会为自动创建诸如&#xff1a;.pro、.h\.cpp、.iu等文件&#xff0c;这些文件到底是什么&#xff1f;我们在使用Qt时 应该…

聊聊Git合并和变基

一、 Git Merge 合并策略 1.1 Fast-Forward Merge&#xff08;快进式合并&#xff09; //在分支1下操作&#xff0c;会将分支1合并到分支2中 git merge <分支2>最简单的合并算法&#xff0c;它是在一条不分叉的两个分支之间进行合并。快进式合并是默认的合并行为&#…

mysql注入联合查询

环境搭建 下载复现漏洞的包 下载小皮面板 将下载好的文件解压在小皮面板的phpstudy_pro\WWW路径下 将这个文件phpstudy_pro\WWW\sqli-labs-php7-master\sql-connections\db-creds.inc 中的密码更改为小皮面板中的密码 选择php版本 在小皮中启动nginx和数据库 使用环回地址访…

JavaScript 学习笔记(JS进阶 Day4)

「写在前面」 本文为 b 站黑马程序员 pink 老师 JavaScript 教程的学习笔记。本着自己学习、分享他人的态度&#xff0c;分享学习笔记&#xff0c;希望能对大家有所帮助。推荐先按顺序阅读往期内容&#xff1a; 1. JavaScript 学习笔记&#xff08;Day1&#xff09; 2. JavaSc…

NodeJs环境安装与配置

最近电脑重装了系统&#xff0c;开发环境啥的都得重装&#xff0c;顺便记录下 nodeJs 的安装与配置&#xff0c;方便需要的同学查看&#xff0c;也方便自己以后查找。 安装 下载地址&#xff1a;https://nodejs.cn/download/ 根据需要选择自己环境需要的下载即可&#xff0c;…

【cdh】hive执行SQL提示缺少3.0.0-cdh6.3.2-mr-framework.tar.gz文件

问题&#xff1a;执行SQL报错提示缺少文件 异常信息如下 在hdfs上查看的时候连文件夹都没有&#xff0c;所以这个异常会抛出&#xff0c;但是我是基于CDH搭建的&#xff0c;可以直接基于下面操作 执行完成之后查看HDFS文件 重新执行SQL发现可以正常执行了

web前端项目-实现录音功能【附源码】

录音功能 运行效果&#xff1a;本项目可实现录音软件的录音、存储、播放等功能 HTML源码&#xff1a; &#xff08;1&#xff09;index.html&#xff1a; <!DOCTYPE html> <html><head><meta http-equiv"Content-Type" content"text/h…

【BUG】联想Y7000电池电量为0且无法充电解决方案汇总

因为最近火灾很多&#xff0c;所以昨天夜晚睡觉的时候把插线板电源关掉了&#xff0c;电脑也关机了。 各位一定要注意用电安全&#xff0c;网上的那些事情看着真的很难受qvq。 第二天早上起床的时候一看发现电脑直接没电了&#xff0c;插上电源后也是显示 你一定要冲进去啊(ू˃…

springboot外出务工人员信息管理系统源码和论文

网络的广泛应用给生活带来了十分的便利。所以把疫情防控期间某村外出务工人员信息管理与现在网络相结合&#xff0c;利用java技术建设疫情防控期间某村外出务工人员信息管理系统&#xff0c;实现疫情防控期间某村外出务工人员信息的信息化。则对于进一步提高疫情防控期间某村外…

2024阿里云和腾讯云的第一战打响:搭建《幻兽帕鲁》私服游戏

为了搭建《幻兽帕鲁》游戏私服&#xff0c; 2024年阿里云 VS 腾讯云的第一场战争开始了…… 事情是这样的&#xff1a; 1月19日&#xff0c;最离谱新游 《幻兽帕鲁》突然爆火了&#xff0c;这是一款日本开发商展耗费4年开发的冒险类游戏&#xff0c;这款戏一推出就迅速俘获了…

DOM 型 XSS 攻击演示(附链接)

一、介绍 DOM&#xff08;Document Object Model&#xff09;型 XSS&#xff08;Cross-Site Scripting&#xff09;攻击是一种 Web 应用程序中的安全漏洞&#xff0c;其特点是攻击者成功地注入了恶意脚本&#xff0c;这些脚本在用户的浏览器中执行&#xff0c;从而导致恶意行为…

AcWing 895. 最长上升子序列(DP序列模型)

[题目概述] 给定一个长度为 N 的数列&#xff0c;求数值严格单调递增的子序列的长度最长是多少。 输入格式 第一行包含整数 N。 第二行包含 N 个整数&#xff0c;表示完整序列。 输出格式 输出一个整数&#xff0c;表示最大长度。 数据范围 1 ≤ N ≤ 1000 &#xff0c; …

【刷题】 leetcode 面试题 08.05.递归乘法

递归乘法 1 题目描述2 思路一&#xff08;返璞归真版&#xff09;3 思路二&#xff08;二进制乘法器版&#xff09;4 思路三&#xff08;变态版&#xff09;Thanks♪(&#xff65;ω&#xff65;)&#xff89;谢谢阅读下一篇文章见&#xff01;&#xff01;&#xff01; 1 题目…

不确定优化入门:用简单实例讲明白随机规划、鲁棒优化和分布鲁棒优化

文章目录 1 引言2 学习动机3 经典问题4 解决方案4.1 忽略不确定性4.2 随机规划4.3 鲁棒优化4.4 分布鲁棒优化 5 总结相关阅读 1 引言 按2024的原定计划&#xff0c;今年开始要学习不确定优化了。 粗略翻阅了一些相关的书籍和教程&#xff0c;大都包含许多数学公式&#xff0c…

SpringBoot引入主盘探活定时任务

主盘探活通常是指检查存储设备&#xff08;例如硬盘&#xff09;是否可读写&#xff0c;但在Java中并没有直接针对硬件级别的磁盘探活API。然而&#xff0c;我们可以模拟一个场景&#xff0c;即检查某个目录或文件是否可以被Java程序正常读写&#xff0c;以此作为主盘活跃的一个…

HCIP复习课(bgp实验)

1、ip配置&#xff1a; R1&#xff1a; R2&#xff1a; R9&#xff1a; R10&#xff1a; R11&#xff1a; R3&#xff1a; R4&#xff1a; R5&#xff1a; R6&#xff1a; R7&#xff1a; R8&#xff1a; 2、隧道配置&#xff1a; R2&#xff1a; 静态&#xff1a; R10&am…