滑动窗口/双指针相关题

滑动窗口和双指针往往用于数组相关的题目,且题目要求的往往是一个子串,而不是子序列。即要求的内容必须是连续的。滑动窗口的题往往需要先是从左到右迭代;双指针则更灵活。此外,许多链表题都可以用到双指针。

滑动窗口

3.无重复字符的最长子串

给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: s = “abcabcbb”
输出: 3
解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。
示例 2:
输入: s = “bbbbb”
输出: 1
解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。
示例 3:
输入: s = “pwwkew”
输出: 3
解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。
请注意,你的答案必须是 子串 的长度,“pwke” 是一个子序列,不是子串。

因为要求的是子串,因此可以先尝试从滑动窗口或双指针入手。按照题目的要求,可以发现,判断某个串是否重复是递增来实现比较容易,且当出现重复只需减少左侧即可,因此可以用滑动窗口。当前字符与窗口内的字符没有重复时,就可以将窗口右移,直到 ( a b c ) a b c b b (abc)abcbb (abc)abcbb;而遇到重复的字符时,如 ( a b c a ) b c b b (abca)bcbb (abca)bcbb,要保持窗口内的子串不重复,只需将左边窗口移到当前字符的重复字符的右侧 a ( b c a ) b c b b a(bca)bcbb a(bca)bcbb 即可。

要判断是否重复,只需要用到Map()记录当前串中每个字符的下标即可。这样每次重复,只需要将左窗口移到Map()中记录的对应下标的右侧,并更新该下标即可。

拓展

209. 长度最小的子数组
978. 最长湍流子数组
438. 找到字符串中所有字母异位词(推荐)
76. 最小覆盖子串(推荐)
239. 滑动窗口最大值(推荐)

双指针

11. 盛最多水的容器

给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。返回容器可以储存的最大水量。
说明:你不能倾斜容器。
Alt
示例 1:
输入:[1,8,6,2,5,4,8,3,7]
输出:49
解释:图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。

这题本质求的还是一个子串,只是不需要串的内容,只需要知道字串的两个端点高度与其下标即可。先关注我们要求的目标,即面积。假设两端的下标分别为 l , r l, r l,r,则面积为 ( r − l ) ∗ m i n ( h e i g h t [ l ] , h e i g h t [ r ] ) (r-l)*min(height[l], height[r]) (rl)min(height[l],height[r])。其中,底边的长度是很容易得到,并可以迭代,那么关键就是怎么处理迭代时的高度,使得最终结果就是我们想要的结果,即最大面积。

首先,当 l , r l,r l,r 确定时,显然,面积是可以通过求 m i n ( h e i g h t [ l ] , h e i g h t [ r ] ) min(height[l], height[r]) min(height[l],height[r]) 来确定的。因此,关键就在于怎么迭代 l , r l, r l,r。当 l = 0 , r = n − 1 l=0, r = n-1 l=0,r=n1时,底边最大,且结果唯一。而当底边值减1时,有两种情况。一种是移动高度小的一边,一种是移动高度大的一边。我们期望的是新的长方体高度要比前一次的高,才有可能面积更大。而如果移动的是高度大的一边,那么新的长方体,高度不会大于前一次迭代,而底又减少了,因此总面积一定是下降的,那么得到的结果显然不会是我们想要的。因此,是要移动高度低的一端,即 l = l + 1 l = l + 1 l=l+1。这样,每一次迭代后,记录并比较当前的结果,最终就能得到最大的面积,且复杂度为 O ( n ) O(n) O(n)

拓展

31. 下一个排列
86. 分隔链表
75.颜色分类(推荐)
42. 接雨水(多种解法)

快慢指针

141.环形链表
234. 回文链表(推荐)
287. 寻找重复数
457. 环形数组是否存在循环

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值