【算法】滑动窗口三步走 (4)

代码

class Solution { public int equalSubstring(String s, String t, int maxCost) { int left = 0, right =0; int sum = 0; int res = 0;      // 构造窗口 while (right < s.length()) { sum += Math.abs(s.charAt(right) - t.charAt(right)); right++;        // 窗口构造完成,这时候要根据条件当前的窗口调整窗口大小 while (sum > maxCost) { sum -= Math.abs(s.charAt(left) - t.charAt(left)); left++; }        // 记录此时窗口的大小 res = Math.max(res, right -left); } return res; } }

这里跟前面总结的框架不一样的一个点就是,前面的框架是求最小窗口大小,这里是求最大窗口大小,大家要学会灵活变通。

239. 滑动窗口最大值

给定一个数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。

返回滑动窗口中的最大值。

进阶:

你能在线性时间复杂度内解决此题吗?

示例:

输入: nums = [1,3,-1,-3,5,3,6,7], 和 k = 3
输出: [3,3,5,5,6,7]
解释:

滑动窗口的位置 最大值
--------------- -----
[1 3 -1] -3 5 3 6 7 3
1 [3 -1 -3] 5 3 6 7 3
1 3 [-1 -3 5] 3 6 7 5
1 3 -1 [-3 5 3] 6 7 5
1 3 -1 -3 [5 3 6] 7 6
1 3 -1 -3 5 [3 6 7] 7

提示:

1 <= nums.length <= 10^5
-10^4 <= nums[i] <= 10^4
1 <= k <= nums.length

解答:

class Solution { public static int[] maxSlidingWindow(int[] nums, int k) { int right =0; int[] res = new int[nums.length -k +1]; int index=0; LinkedList<Integer> list = new LinkedList<>();      // 开始构造窗口 while (right < nums.length) {        // 这里的list的首位必须是窗口中最大的那位 while (!list.isEmpty() && nums[right] > list.peekLast()) { list.removeLast(); }        // 不断添加 list.addLast(nums[right]); right++;        // 构造窗口完成,这时候需要根据条件做一些操作 if (right >= k){ res[index++]=list.peekFirst();           // 如果发现第一个已经在窗口外面了,就移除 if(list.peekFirst() == nums[right-k]) { list.removeFirst(); } } } return res; } }

这道题难度是困难。当然我们也会发现,这道题目和前面的非固定大小滑动窗口还是不一样的。

看了一道困难的题目后,接下来看一道中等难度的就会发现是小菜一碟。

1456. 定长子串中元音的最大数目

给你字符串 s 和整数 k 。

请返回字符串 s 中长度为 k 的单个子字符串中可能包含的最大元音字母数。

英文中的 元音字母 为(a, e, i, o, u)。

示例 1:

输入:s = "abciiidef", k = 3
输出:3
解释:子字符串 "iii" 包含 3 个元音字母。

示例 2:

输入:s = "aeiou", k = 2
输出:2
解释:任意长度为 2 的子字符串都包含 2 个元音字母。

示例 3:

输入:s = "leetcode", k = 3
输出:2
解释:"lee"、"eet" 和 "ode" 都包含 2 个元音字母。

示例 4:

输入:s = "rhythms", k = 4
输出:0
解释:字符串 s 中不含任何元音字母。

示例 5:

输入:s = "tryhard", k = 4
输出:1

提示:

1 <= s.length <= 10^5
s 由小写英文字母组成
1 <= k <= s.length

解答 class Solution { public int maxVowels(String s, int k) { int right =0; int sum = 0; int max = 0; while (right < s.length()) { sum += isYuan(s.charAt(right)) ; right++; if (right >=k) { max = Math.max(max, sum); sum -= isYuan(s.charAt(right-k)); } } return max; } public int isYuan(char s) { return s=='a' || s=='e' ||s=='i' ||s=='o' ||s=='u' ? 1:0; } } 实例2 剑指Offer57.和为s的连续正数序列(简单)

题目:输入一个正整数 target ,输出所有和为 target 的连续正整数序列(至少含有两个数)。序列内的数字由小到大排列,不同序列按照首个数字从小到大排列。

示例 1:

输入:target = 9

输出:[[2,3,4],[4,5]]

示例 2:

输入:target = 15

输出:[[1,2,3,4,5],[4,5,6],[7,8]]

答案

这个题目比较简单,典型的一道滑动窗口的题目。

假若我们输入的 target 为 9,大脑中应该有下面这么个玩意:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpwyxf.html