滑动窗口不也挺好的嘛
滑动窗口不也挺好的吗.jpg
这个月大胆预测一波,这个月可能是leetcode的滑动窗口月,先提前开个坑(,毕竟上个月的查并集月已经在写了已经在写了(雾。
643. 子数组最大平均数 I
给定 n
个整数,找出平均数最大且长度为 k
的连续子数组,并输出该最大平均数。
示例:
1 | 输入:[1,12,-5,-6,50,3], k = 4 |
提示:
- 1 <=
k
<=n
<= 30,000。 - 所给数据范围 [-10,000,10,000]。
非常典型的滑动窗口类型题目,不过暴力嘛很容易超时,当然如果你之前做过滑动窗口类型的题目的话,这题肯定一眼就看出来了.jpg。当然代码也在意料之中的很简单。
1 | class Solution { |
1208. 尽可能使字符串相等
给你两个长度相同的字符串,s
和 t
。
将 s
中的第 i
个字符变到 t
中的第 i
个字符需要 |s[i] - t[i]|
的开销(开销可能为 0),也就是两个字符的 ASCII 码值的差的绝对值。
用于变更字符串的最大预算是 maxCost
。在转化字符串时,总开销应当小于等于该预算,这也意味着字符串的转化可能是不完全的。
如果你可以将 s
的子字符串转化为它在 t
中对应的子字符串,则返回可以转化的最大长度。
如果 s
中没有子字符串可以转化成 t
中对应的子字符串,则返回 0
。
示例 1:
1 | 输入:s = "abcd", t = "bcdf", cost = 3 |
示例 2:
1 | 输入:s = "abcd", t = "cdef", cost = 3 |
示例 3:
1 | 输入:s = "abcd", t = "acde", cost = 0 |
提示:
1 <= s.length, t.length <= 10^5
0 <= maxCost <= 10^6
s
和t
都只含小写英文字母。
这题也是滑动窗口类型的题耶,滑动窗口月实锤!!!!,这题也是滑动窗口诶,这题的滑动窗口使用双指针来维护,right指针不变,让left指针来缩小范围即可,简单题我重拳出击,困难题我唯唯诺诺(。
1 | class Solution { |
ps:有人指出这题严格来说不算是滑动窗口,严格来说应该是双指针,两者的区别在于「滑动窗口」是一类问题本身,「双指针」是解决一类二分查找问题的通用优化方法。或者说滑动窗口」本身并不是解决问题的一种方法(或者说算法),它其实就是这个问题本身。我们需要做的是寻找合适的数据结构来「维护」这个「滑动窗口」,比如说第一题典型的滑动窗口
1423. 可获得的最大点数
几张卡牌 排成一行,每张卡牌都有一个对应的点数。点数由整数数组 cardPoints
给出。
每次行动,你可以从行的开头或者末尾拿一张卡牌,最终你必须正好拿 k
张卡牌。
你的点数就是你拿到手中的所有卡牌的点数之和。
给你一个整数数组 cardPoints
和整数 k
,请你返回可以获得的最大点数。
示例 1:
1 | 输入:cardPoints = [1,2,3,4,5,6,1], k = 3 |
示例 2:
1 | 输入:cardPoints = [2,2,2], k = 2 |
示例 3:
1 | 输入:cardPoints = [9,7,7,9,7,7,9], k = 7 |
示例 4:
1 | 输入:cardPoints = [1,1000,1], k = 1 |
示例 5:
1 | 输入:cardPoints = [1,79,80,1,1,1,200,1], k = 3 |
提示:
1 <= cardPoints.length <= 10^5
1 <= cardPoints[i] <= 10^4
1 <= k <= cardPoints.length
emmmmm这题我一开始就陷入了误区,慌慌忙忙开始敲代码,这题既然求最大的点数之和,我们只需要维护最小的滑动窗口就行了,知道了这点之后就变得很简单了
1 | class Solution { |
978. 最长湍流子数组
当 A
的子数组 A[i], A[i+1], ..., A[j]
满足下列条件时,我们称其为湍流子数组:
- 若
i <= k < j
,当k
为奇数时,A[k] > A[k+1]
,且当k
为偶数时,A[k] < A[k+1]
; - 或 若
i <= k < j
,当k
为偶数时,A[k] > A[k+1]
,且当k
为奇数时,A[k] < A[k+1]
。
也就是说,如果比较符号在子数组中的每个相邻元素对之间翻转,则该子数组是湍流子数组。
返回 A
的最大湍流子数组的长度。
示例 1:
1 | 输入:[9,4,2,10,7,8,8,1,9] |
示例 2:
1 | 输入:[4,8,12,16] |
示例 3:
1 | 输入:[100] |
提示:
1 <= A.length <= 40000
0 <= A[i] <= 10^9
这题我们根据定义可能会存在arr[right-1]<arr[right]&&arr[right]>arr[right+1]
或者arr[right-1]>arr[right]&&arr[right]<arr[right-1]
,这两种情况需要把right向右移动一个单位,此外当无法满足这两种情况时需要另left=right
。
当窗口的长度为1时,需要把left和right都右移一个单位
1 | class Solution { |
485. 最大连续 1 的个数
给定一个二进制数组, 计算其中最大连续 1 的个数。
示例:
1 | 输入:[1,1,0,1,1,1] |
提示:
- 输入的数组只包含
0
和1
。 - 输入数组的长度是正整数,且不超过 10,000。
这题有了上面几题的经验和模板应该很容易看出来了.jpg
1 | class Solution { |
1004. 最大连续1的个数 III
给定一个由若干 0
和 1
组成的数组 A
,我们最多可以将 K
个值从 0 变成 1 。
返回仅包含 1 的最长(连续)子数组的长度。
示例 1:
1 | 输入:A = [1,1,1,0,0,0,1,1,1,1,0], K = 2 |
示例 2:
1 | 输入:A = [0,0,1,1,0,0,1,1,1,0,1,1,0,0,0,1,1,1,1], K = 3 |
提示:
1 <= A.length <= 20000
0 <= K <= A.length
A[i]
为0
或1
这题看了半天没想到怎么用滑动数组,这里其实不用去计算1的数量,我们只需要去维护0的数量小于2的滑动窗口就好了,想通了这一点之后就变得很简单了,代码的话是常规滑动数组的写法,也没什么好说的,总之就是很简单.jpg
1 | class Solution { |
1052. 爱生气的书店老板
今天,书店老板有一家店打算试营业 customers.length
分钟。每分钟都有一些顾客(customers[i]
)会进入书店,所有这些顾客都会在那一分钟结束后离开。
在某些时候,书店老板会生气。 如果书店老板在第 i
分钟生气,那么 grumpy[i] = 1
,否则 grumpy[i] = 0
。 当书店老板生气时,那一分钟的顾客就会不满意,不生气则他们是满意的。
书店老板知道一个秘密技巧,能抑制自己的情绪,可以让自己连续 X
分钟不生气,但却只能使用一次。
请你返回这一天营业下来,最多有多少客户能够感到满意的数量。
示例:
1 | 输入:customers = [1,0,1,2,1,1,7,5], grumpy = [0,1,0,1,0,1,0,1], X = 3 |
提示:
1 <= X <= customers.length == grumpy.length <= 20000
0 <= customers[i] <= 1000
0 <= grumpy[i] <= 1
这题也是典型的滑动窗口,这题灵活的运用了数组customer和grumpy的关系,代码实现倒是很简单,弹前提是活用customer和grumpy的关系,代码实现倒是很常规
1 | class Solution { |
这是二月最后一道滑动窗口题啦,这我我最后的波纹啦,jojo!!!!
395. 至少有 K 个重复字符的最长子串
给你一个字符串 s
和一个整数 k
,请你找出 s
中的最长子串, 要求该子串中的每一字符出现次数都不少于 k
。返回这一子串的长度。
示例 1:
1 | 输入:s = "aaabb", k = 3 |
示例 2:
1 | 输入:s = "ababbc", k = 2 |
提示:
1 <= s.length <= 104
s
仅由小写英文字母组成1 <= k <= 105
1 | class Solution { |
嗯这的确是leetcode本月最后一道滑动窗口题,二月最后一道滑动窗口题发出了它最后的波纹,二月的题我几乎每道题都打了,注意是几乎是几乎,也就是说还有几道因为大过年的懒得刷,还有令我唯唯诺诺的困难题,嗯!!!二月勋章没拿到呢!!!!