【LeetCode】双指针 滑动窗口

news/2025/2/12 8:15:44/

文章目录

    • 一、双指针简介
      • 双指针模式
      • 使用双指针来解决的问题
      • 题目
        • 移动0
        • 盛最多水的容器
        • 接雨水
    • 二、滑动窗口简介
      • 题目
        • 最小子串
        • 找到字符串中所有字母异位词

一、双指针简介

双指针是指在算法中同时使用两个指针来追踪数组或序列中的元素位置。这两个指针可以朝着相同方向移动,也可以朝着相反方向移动。
在算法问题中,双指针通常用于在数组、链表或其他数据结构中执行一些特定的操作,如搜索、遍历、或找出满足条件的子序列等。

双指针模式

1、快慢指针: 两个指针以不同的速度移动。快指针可能每次移动两步,而慢指针每次移动一步。这种模式常用于检测循环或链表中的环。

2、左右指针: 两个指针分别从数组的两端开始移动,逐渐向中间靠拢。这种模式常用于在有序数组中查找特定的元素,或解决一些数组中的问题。

3、滑动窗口: 两个指针构成一个窗口,通过移动窗口来执行某种操作。这种模式常用于解决子数组或子字符串的问题。

使用双指针的好处在于可以在不使用额外空间的情况下,以较高的效率解决一些问题。在一些情况下,双指针也可以降低算法的时间复杂度。

需要注意的是,不同的问题可能需要不同类型的双指针,因此在应用双指针模式时,需要根据具体情况选择合适的策略。

使用双指针来解决的问题

在解决算法问题时,能够使用双指针的问题通常具有一些特征,这些特征可能暗示着双指针方法可能是有效的。以下是一些常见的特征,可以帮助你判断一道问题是否可以用双指针来解决:

1、有序数组或链表: 当问题涉及到有序数组或链表时,双指针通常是一个不错的选择。在这种情况下,可以使用双指针来在数组或链表中进行搜索、查找或执行其他操作。

2、滑动窗口问题: 如果问题涉及到窗口的概念,比如求解子数组或子字符串的问题,那么双指针可能是一个合适的选择。滑动窗口问题通常可以使用两个指针来表示窗口的起始和结束。

3、夹逼法: 当问题可以通过夹逼法来解决时,双指针也是常见的选择。夹逼法通常在数组中查找满足一些条件的两个元素时使用,例如在有序数组中查找两个元素的和等于目标值。

4、反转问题: 一些反转类的问题,尤其是链表的反转问题,常常可以使用双指针来解决。

5、快慢指针: 在涉及到环或链表中的一些特殊结构时,快慢指针通常是一个有用的技巧。比如,判断链表是否有环,或者找到环的起点等。

归并操作: 在某些情况下,双指针可以用于归并操作,例如合并两个有序数组。

题目

移动0
盛最多水的容器
接雨水

思路:

  1. 设置左右指针、左边最大高度和右边最大高度
  2. 遍历数组,当左指针小于右指针的时候,执行下面步骤
    • 如果左边高度小于右边高度,说明左侧高度低
      • 检查当前柱子的高度是否大于等于左边最大高度
      • 如果是,更新左边最大高度
      • 如果不是,计算积水量,并且累加到总计中,然后左指针右移
    • 如果左边高度大于等于右边高度,说明右侧高度低
      • 检查当前柱子的高度是否大于右边最大高度
      • 如果是,更新右边最大高度
      • 如果不是,计算积水量,并且累加到总结中,然后右指针左移
// 接雨水
/*** @param {number[]} height* @return {number}*/
var trap = function(height) {};

二、滑动窗口简介

是什么:通过一个左右指针维护一个窗口,确定窗口需要满足的条件。在滑动窗口的过程中,根据题目的要求记录解或更新最优解

基本步骤
1、初始化:定义两个指针,左指针(start)和右指针(end),表示窗口的开始和结束位置
2、滑动窗口:开始遍历数组或列标,移动右指针或者左指针,调整窗口大小
3、记录结果:在滑动过程中,记录解或者更新最优解
4、窗口的条件:根据问题的要求,确定窗口需要满足的条件,通常是某个区间的和、平均值、最大最小值
5、结束条件:确定何时停止滑动窗口,通常是右指针到达数组的末尾

题目

最小子串

思路:

  1. 初始化左指针为0,标记窗口的开始位置
  2. 初始化最大子串长度为0,记录最长子串长度
  3. 初始化字符到索引的映射charIndexMap,用于存储每个字符最后一次出现的位置
  4. 遍历字符串,右指针从0开始向右移动
  5. 对于每个字符,检查是否出现在当前窗口
    • 如果出现过,移动左指针到重复字符的下一个位置,确保窗口中的字符不是重复的
    • 更新字符到索引的映射charIndexMap
    • 更新最大子串长度
  6. 直到循环结束
   // 初始化左指针、最大子串长度、字符到索引的映射let left = 0;let maxLength = 0;const charIndexMap = {};// 遍历字符串for (let right = 0; right < s.length; right++) {const currentChar = s[right];// 如果当前字符已经在窗口中出现过if (charIndexMap[currentChar] !== undefined && charIndexMap[currentChar] >= left) {// 移动左指针到重复字符的下一个位置left = charIndexMap[currentChar] + 1;}// 更新字符到索引的映射charIndexMap[currentChar] = right;// 更新最大子串长度maxLength = Math.max(maxLength, right - left + 1);}// 返回最大子串长度return maxLength; 
    const charIndex = new Array(256).fill(-1); // ASCII 字符集let left = 0;let maxLength = 0;for (let right = 0; right < s.length; right++) {const currentChar = s[right];const charCode = currentChar.charCodeAt(0);left = Math.max(left, charIndex[charCode] + 1); // 更新左指针,确保它不会后退到已经遍历过的位置charIndex[charCode] = right; // 更新字符的最后出现位置maxLength = Math.max(maxLength, right - left + 1);}return maxLength;
找到字符串中所有字母异位词

http://www.ppmy.cn/news/1155934.html

相关文章

【数据结构】算法、时间复杂度和空间复杂度详解 ------ 算法篇

文章目录 &#x1f4cb;前言一. ⛳️算法的定义二. ⛳️算法的特性2.1 输入输出2.2 输入输出2.3 有穷性2.4 确定性2.5 可行性 三. ⛳️算法设计要求3.1 正确性3.2 可读性3.2 健壮性3.3 时间效率高和存储量低 四. ⛳️算法效率的度量方法4.1 事后统计方法4.2 事前分析估算方法 五…

论文学习——FALL-E:GAUDIO FOLEY SYNTHESIS SYSTEM

文章目录 引言正文AbstractIntroduction介绍问题 FALL-E2.1 Architexture结构2.2 Training and Inference Details 3 Evaluation And Analysis测试和分析Conlusion 总结 引言 这篇文章是DCASE中少有的&#xff0c;没有使用DIffusion的方法&#xff0c;可以学习一下。这篇文章的…

【力扣520】检测大写字母

&#x1f451;专栏内容&#xff1a;力扣刷题⛪个人主页&#xff1a;子夜的星的主页&#x1f495;座右铭&#xff1a;前路未远&#xff0c;步履不停 目录 一、题目描述二、题目分析 一、题目描述 题目链接&#xff1a;检测大写字母 我们定义&#xff0c;在以下情况时&#xff…

【LLM微调范式1】Prefix-Tuning: Optimizing Continuous Prompts for Generation

论文标题&#xff1a;Prefix-Tuning: Optimizing Continuous Prompts for Generation 论文作者&#xff1a;Xiang Lisa Li, Percy Liang 论文原文&#xff1a;https://arxiv.org/abs/2101.00190 论文出处&#xff1a;ACL 2021 论文被引&#xff1a;1588&#xff08;2023/10/14&…

Go选项模式

Functional Options Pattern&#xff0c;选项模式 1、什么是选项模式 选项模式是一种在 Go 语言中很常用的设计模式&#xff0c;特别是当你有一个结构体或函数&#xff0c;并且它有多个可选的配置选项时。该模式允许用户提供一系列的的函数来设置结构体的属性或修改函数的行为…

pwnable-1-fd

pwn的学习周期确实比较长&#xff0c;需要的前置内容也很多&#xff0c;了解到第一题还算比较简单的&#xff0c;那就先来体验一波~顺带附一波网站链接:&#x1f449;网站链接 题目 WP 最后一行给出了ssh链接方式&#xff0c;那就先连接一波 第一次连接会有第四行的询问&…

C语言练习百题之位符号的使用

当使用C语言中的按位与运算符 & 时&#xff0c;需要理解其用途、应用场景、源代码示例以及相应的注意事项。以下是一篇关于C语言按位与运算符的详细文章&#xff0c;包括示例源代码和注释。 C语言中的按位与运算符 & 按位与运算符 & 是C语言中用于对二进制位进行…

【大模型应用开发教程】01_大模型简介

C1 大模型简介 一. 什么是LLM&#xff08;大语言模型&#xff09;&#xff1f;1. 发展历程2. 大语言模型的概念LLM的应用和影响 二、大模型的能力和特点1. 大模型的能力1.1 涌现能力&#xff08;emergent abilities&#xff09;1.2 作为基座模型支持多元应用的能力1.3 支持对话…