本文包含如下题目:
30. Substring with Concatenation of All Words
76. Minimum Window Substring
209. Minimum Size Subarray Sum
239. Sliding Window Maximum
30. Substring with Concatenation of All Words
解题思路
- 首先构建一个
map<string, int>
保存words中字符串,每个对应int值为1;- 然后对搜索字符串进行遍历,将等长的子字符串保存在
map<string, int>
中;- 如果有新的子字符串或者相同的子字符串数量超过words所给出的数量,则判定失败。
代码
1 | class Solution |
76. Minimum Window Substring
解题思路
- 使用一个
vector<int> ch(128, 0)
保存字符的数据信息;- 正如题目描述,需要维持一个窗口,该窗口能够覆盖t中的字符;
- 计算过程就是窗口的移动过程,需要不断地从窗口头部去掉字符元素,然后在尾部添加新的字符,迭代计算窗口的宽度等数值特征;
代码
1 | class Solution |
209. Minimum Size Subarray Sum
解题思路
- 维持一个窗口,不断更新子数组的长度;
代码
1 | class Solution |
239. Sliding Window Maximum
解题思路I
- 为了维持窗口,每次向左添加一位,更新最大值;
- temp[j] = max(nums[j-i], temp[j])其中i表示此时窗口的大小+1;
- 这种方法效率较低,勉强AC;
代码
1 | class Solution |
解题思路II
- 使用
deque
维持一个双向队列,保存加入其中数据的下标;- 对数组进行遍历,在
deque
不为空的情况下,当遍历到下标i的时候,删掉超出范围k的数据,即下标小于i-k+1
的数据;- 每次加入一个数据nums[i]的时候,删除比他还要小的数据,因为在整个作用范围内,小于nums[i]的数都不可能成为最大的数据;
- 上述操作维持
deque
是一个降序的队列,取窗口最大值只需要取deque
的头部数据就可以了。
代码
1 | class Solution |