LeetCode双指针(包含滑动窗口)刷题分析与总结

这一部分:事情比较多,掌握的并不是特别好,时间大概从 5/3-5/13
之后需要加强

双指针介绍

双指针:可以应用在

  • 数组
  • 字符串
  • 链表上
    主要是定义两个指针,对这种串行、链式的数据对象进行某种遍历,依据数据结构的特点进行遍历,分析

双指针类型

  • 快慢指针:定义两个指针,一个指针在前,一个指针在后,走的步数不一样,在求链表的中间节点,链表是否有环上可能用的到
  • 首尾指针:采用指针指向数组,字符串的首位进行分析,不断向中间逼近,回文数组/字符串/链表,求有序数组的和
  • 两个指针指向两个对象:每个指针指向自己的对象,然后遍历每个对象,从前往后进行遍历,分析;数组的合并
  • 两个指针从数据对象中的某个位置,分别向后和向前进行遍历

双指针技巧

  • 若数组题目,可以先对数组进行排序
  • 若是字符串求匹配,包含了之类的,可以使用hashMap或者`滑动窗口的方法,进行分析
  • 字符串可以转换为Character数组或者用到栈、队列

滑动窗口

  • [滑动窗口,如何增大窗口,如何缩](https://blog.csdn.net/ZHOUJIAN_TANK/article/details/107952663)

双指针题型

数组相关题

  • 删除排序数组中的重复项对于数组、链表、字符串:一般可以采用双指针,定义两个指针,left,right,指针的含义分别是已经过滤号的数组的尾部,和不重复数组的头部,若发现nums[left]==nums[right]则不断向后移动right直到发现不重复的元素,则将nums[left+1]=nums[rightt]遍历上述过程、
  • 移除数组中某个元素:双指针:left指针指向不包含该元素的数组尾部,right指向正在遍历的数组的初始,若发现·value值则将right移动跳过该值,否则将right出元素赋值给left处元素
  • 移除0到数组的末尾双指针:定义两个指针,遍历数组,left指向不是0数组的末尾,right指向需要带遍历数组的首部,若发现right不为0则将right出的元素赋值到left处
  • 有序数组的平方:因为正负数的数组的平方可能相等,则若直接遍历数组可能造成的结果重复,因此可以采取使用set进行去重;也可以采用双指针的方法,先找到非负数的方法,定义left:为负数的最后一个元素,right:为正数的第一个元素,left指针不断向前移动,right指针不断向后移动,;进行比较判断即可
  • 两数之和输入有序数组:首尾指针向中间推进
  • 合并两个有序数组定义两个指针分别指向连个数组:进行位置上的比较,不断向后遍历两个数组。
  • 两个数组的交集(重复元素跳过):先对数组进行排序,然后定义指针index1,index2分别遍历两个数组,两个指针分别遍历两个数组,若发现数组中有重复元素,则跳过重复元素,然后判断两个数组的值是否相等;如相等则将值存入结果集中,若数组1小于数组2,则将数组1中的指针向前移动,反之
  • 两个数组的交集(重复元素不跳过大量元素如何处理):可以采用349那样,先对数组进行排序,然后使用双指针,遍历数组,进行判断
  • 数组中的K-diff对:先对数组进行排序,然后再定义连个指针left,right,前后指针

链表相关题目

  • 链表的中间节点快慢指针,一个指针一次走两步,一个指针一次走一步,当快指针走到链表尾部的时候,满指针则走到链表的中间节点
  • 反转链表迭代法:双指针;一个指针指向已经反转链表的尾部,一个指针指向待反转链表的首部,不断遍历即可,更改链表指针指向
  • 回文链表:可以将链表中部以后进行反转,然后再进行双指针遍历比较,这道题比较总和
  • 环形链表:快慢指针,一个指针一次走两步,一个指针一次走一步,只要是链表有环则最终两个指针会有相遇的时候

字符串相关题目

  • 反转字符串首位指针不断向中间遍历,交换这两个指针所指向的位置
  • 验证回文串首尾指针:left :从前往后遍历字符串 ,right从后往前遍历字符串,若发现不是字符则跳过continue,进行比较是否相等
  • 实现indexOf:双指针: 通过一个指针指向haystack,一个指针指向needle,不断移动指针向前走,若发现needle指针指到字符串的尾部则说明相等此时结束;若发现遍历到的某个字符不相等则需要回溯haystack,并将needle指针重置
  • 反转字符串中的元音字母:首尾指针:定义两个指针,从数组两端向数组中间遍历,若发现元音字母则进行交换,否则进行遍历。
  • 比较含退格的字符串是否相等:重构字符串,使用栈`用build(S)和build(T)构造取出了退格和被删除字符后的字符串然后比较它们是否相等。
  • 长按键入:两个字符串分别用指针进行遍历

滑动窗口

参考>>>

  • 无重复最长子串:滑动窗口:定义一个窗口left---rightleft----right这个窗口内元素是不重复的,不断移动right并将其值存入hashMap中,方便进行去重,使用hashMap.contains(key)即可判断在当前移动到的位置是否包含了之前窗口中的位置,若发现需要移动窗口的左边在更新左边界的位置left=Math.max(lweft,map.get(s.char(i)+1)
  • 串联所有单词的子串:遍历所有words,将words中的每个字符串都存在hashMap allwords中,key存放值,value存放其出现的次数,遍历所有子串,将当前子串所包含单词存放hasWords中,若遍历到的字符串不存在allwords中的字符串,或者电气概念遍历到的字符串中的个数大于allWords中的字符串则结束此次遍历接着下次遍历,在这种方式下,我们每次移动一个字符串
  • 最小覆盖子串:滑动窗口:定义一个hashMap存放字符串T中的所有元素,窗口框定S字符串,left---right确定当前所确定的元素,若在left-----right范围内不包含T则将right不断向右移动,若符合,则再将left向右移动直到不包含该T,用T中的map的每个值是否为0即可判断是否包含T
  • 字符串排列的包含:将匹配字符串hashMap存储起来,用滑动窗口划过pattetrn
  • 滑动窗口内的最大值:滑动窗口:使用一个队列(队列中存放的是数组中元素的索引值),确保队首元素是滑动窗口内的最大值,如何保证,每添加一个元素要判断,这个元素是否大于队列中现有元素,若大于则不断移除队列中的元素,再判断队列中的元素是否不再此时滑动窗口范围内
  • 和为某数的长度最小的子数组长度使用滑动窗口
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值