饕餮盛宴——滑动窗口(尺取法)

注意:此章节作为复习使用,直接代码实现,不写思路。

LeetCode1004

代码实现

class Solution {public int longestOnes(int[] A, int K) {int left = 0;int right = 0;int len = 0;// 0计数器int K1= 0;int nums = 0;while (right < A.length) {if (A[right] == 1) {nums++;}else {K1++;} right++;while (K1 > K) {if (A[left] == 1) {nums--;}else {K1--;}left++;}len = Math.max(right - left, len);}return len;}
}

LeetCode239

代码实现

class Solution {public int[] maxSlidingWindow(int[] nums, int k) {int left = 0;int[] window = new int[nums.length - k + 1];int j = 0;int right = k;while (right <= nums.length) {int maxNum = nums[left];for (int i = left; i < right; i++) {maxNum = Math.max(maxNum, nums[i]);}window[j] = maxNum;right++;left++;j++;}return window;}
}
// 如果需要在自己的IDE上输出,则只需要调用Arrays.toString()方法即可。
// PS:目前这种方法似乎力扣提交显示超时,后面方法多了再说,毕竟是自己手工做的o( ̄▽ ̄)d

LeetCode424

代码实现

class Solution {public int characterReplacement(String s, int k) {// 建立哈希表存储每个字母出现的次数HashMap<Character, Integer> record = new HashMap<>();// 初始化滑动窗口int left = 0;int right = 0;int len = 0;int num = 0;while (right < s.length()) {char c = s.charAt(right);right++;// 初始化哈希表record.put(c, record.getOrDefault(c, 0) + 1);// 找到哈希表中出现次数最多的字母的值num = Math.max(num, record.get(c));len = right - left;// 收缩窗口的时机:当出现次数加上可以替换的次数大于窗口长度时需要收缩窗口while (num + k < len) {char c1 = s.charAt(left);left++;len = right - left;// 更新数据record.put(c1, record.get(c1) - 1);}}if (num + k > s.length()) {return s.length();}return num + k;}
}

LeetCode480

代码实现

class Solution {public double[] medianSlidingWindow(int[] nums, int k) {int left = 0;int right = k;int i = 0;double[] result = new double[nums.length - k + 1];int[] median = new int[k];while (right <= nums.length) {double medianNum = 0.0;System.arraycopy(nums, left, median, 0, k);Arrays.sort(median);if (k % 2 == 0) {// 这里强制类型转换是为了防止数组元素超过int型范围medianNum = (double)((long)median[k / 2] + (long)median[k / 2 - 1]) / 2;}else {medianNum = median[k / 2];}result[i] = medianNum;right++;left++;i++;}return result;}
}

这道题暴力加滑动窗口思想解决,效率低下,暂时就这样。

LeetCode992

代码实现

class Solution {public int subarraysWithKDistinct(int[] A, int K) {return atMostKDistinct(A, K) - atMostKDistinct(A, K - 1);}/*** @param A* @param K* @return 最多包含 K 个不同整数的子区间的个数*/private int atMostKDistinct(int[] A, int K) {int left = 0;int right = 0;int result = 0;HashMap<Integer, Integer> window = new HashMap<>();while (right < A.length) {int a = A[right];window.put(a, window.getOrDefault(a, 0) + 1);right++;while (window.size() > K) {int b = A[left];left++;window.put(b, window.get(b) - 1);if (window.get(b) == 0) {window.remove(b);}}result += right - left;}return result;}}

问:为什么可以用right - left 来表示每次新增子数组?

答:举例说明,[A,B,C]变为[A,B,C,D]新增子数组有[D],[C,D],[B,C,D],[A,B,C,D]。即新数组长度。

注意:遇见恰好转换为最值问题比较适合用滑动窗口。

LeetCode713


与992类似。不过更加简单,理解思路很重要。直接写代码~

class Solution {public int numSubarrayProductLessThanK(int[] nums, int k) {int left = 0;int right = 0;int mul = 1;int result = 0;while (right < nums.length) {int numR = nums[right];mul *= numR;right++;while (mul >= k) {// 注意对特殊情况的处理if (k <= 1) {return 0;}int numL = nums[left];left++;mul /= numL;}// 关键点result += right - left;}return result;}
}

LeetCode904

代码实现

class Solution {public int totalFruit(int[] tree) {int left = 0;int right = 0;int result = 0;HashMap<Integer,Integer> window = new HashMap<>();while (right < tree.length) {int a = tree[right];right++;window.put(a, window.getOrDefault(a, 0) + 1);while (window.size() > 2) {int b = tree[left];left++;window.put(b, window.get(b) - 1);if (window.get(b) == 0) {window.remove(b);}}// 每次保留窗口长度最大值result = Math.max(result, right - left);}return result;}
}

LeetCode1358

代码实现

class Solution {public int numberOfSubstrings(String s) {if (s.length() < 3) {return 0;}if (s == null) {return 0;}int left = 0;int right = 0;int res = 0;HashMap<Character, Integer> window = new HashMap<>();while (right < s.length()) {char ch = s.charAt(right);right++;window.put(ch, window.getOrDefault(ch, 0) + 1);while (window.getOrDefault('a', 0) > 0 && window.getOrDefault('b', 0) > 0 && window.getOrDefault('c', 0) > 0)            {char ch1 = s.charAt(left);res += s.length() - right + 1;left++;window.put(ch1, window.get(ch1) - 1);}}return res;}
}

当然,由于数据量不大,也可以考虑用数组记录结果就行。代码如下:

class Solution {public int numberOfSubstrings(String s) {if (s.length() < 3) {return 0;}if (s == null) {return 0;}int left = 0;int right = 0;int res = 0;int[] ans = new int[s.length()];while (right < s.length()) {char ch = s.charAt(right);right++;ans[ch - 'a']++;while (ans[0] > 0 && ans[1] > 0 && ans[2] > 0) {char ch1 = s.charAt(left);res += s.length() - right + 1;left++;ans[ch1 - 'a']--;}}return res;}
}

未完待续,还有不少类似的题目,先到这里,融会贯通,掌握思想最重要。

饕餮盛宴——滑动窗口(尺取法)相关推荐

  1. 算法篇之-----滑动窗口(尺取法)

    滑动窗口(尺取法 1. 介绍 2. 滑动窗口法的大体框架 4.最小覆盖子串 5.窗口数量 6.最小值 1. 介绍 滑动窗口法,也叫尺取法(可能也不一定相等,大概就是这样 =.=),可以用来解决一些查找 ...

  2. 力扣3. 无重复字符的最长子串 two pointer算法|滑动窗口|尺取法

    无重复字符的最长子串 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例 1: 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 & ...

  3. hdu6119 小小粉丝度度熊【尺取法(滑动窗口)】

    这是2017百度之星初赛二的赛题. 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6119 代码思路: 排序后合并交叉区间 使用尺取法(滑动窗口法),每 ...

  4. [单调栈/差分/尺取/单调队列]Exercise Week5 A最大矩形+B魔法猫+C平衡字符串+D滑动窗口

    目录 A.[单调栈]最大矩形 题意 样例 思路 总结 代码 B.[差分]TT's Magic Cat 题意 样例 思路 总结 代码 C.[尺取]平衡字符串 题意 样例 思路 总结 代码 D.[单调队列 ...

  5. 【CodeForces - 514D】R2D2 and Droid Army(二分+滑动窗口ST表,或 尺取+单调队列或STLmultiset)

    题干: An army of n droids is lined up in one row. Each droid is described by m integers a1, a2, ..., a ...

  6. 尺取法 P1638 逛画展

    P1638 逛画展 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题意: 其实就是求刚好拥有所有m种数字的最短区间 思路: 尺取法 当区间内数字种数刚好为m时记录一下最小区间长度 ...

  7. 算法与数据结构(一):滑动窗口法总结

    滑窗法在算法题中大量应用,其思想简洁强大,但是往往在维护左右指针时候容易出错,现总结整理如下: 1. 介绍 滑动窗口法,也叫尺取法(可能也不一定相等,大概就是这样 =.=),可以用来解决一些查找满足一 ...

  8. 数据结构9-双指针(尺取法)(double pointer)

    双指针有好几种,但是最常用的是尺取法,所以有的时候就说尺取法 双指针,指的是在遍历对象的过程中,不是普通的使用单个指针进行访问,而是使用两个相同方向(快慢指针)或者相反方向(对撞指针)的指针进行扫描, ...

  9. 蓝桥杯:日志统计 尺取法

    蓝桥杯:日志统计 尺取法 题目描述 小明维护着一个程序员论坛.现在他收集了一份"点赞"日志,日志共有N行.其中每一行的格式是: ts id表示在ts时刻编号id的帖子收到一个&qu ...

最新文章

  1. Java日志框架-Logback手册中文版以及官方配置文档教程
  2. POJ 1091 跳蚤
  3. identification for completing the census
  4. 世界科学技术通史_全球科技通史
  5. 基于Nexys4DDR的UART实验
  6. 《图雅的婚事》:图雅为什么带着丈夫改嫁?
  7. codevs1079 回家
  8. 从零开始学习Hadoop--第1章 Hadoop的安装
  9. django处理select下拉表单(从model到前端到post到form)
  10. 【转】.Net 架构图
  11. CSS固定定位(position: fixed;/background-attachment: fixed;)
  12. 【高等数学】定积分1
  13. win8能发挥服务器性能吗,win10系统和win8.1系统哪个更好用?windows10和windows8.1性能对比解析...
  14. [Solved] Javax.Crypto.AEADBadTagException: Tag Mismatch
  15. 电脑硬盘中毒了怎么办?u盘中毒数据丢失怎么恢复
  16. mongodb学习之:mongo安装以及远程访问
  17. A Simple Math Problem题目翻译
  18. 电磁场与电磁波:法拉第电磁感应定律,高斯定律的高斯定律
  19. Boston Dog
  20. anaconda 创建虚拟环境

热门文章

  1. SPRING BOOT之三-Tests
  2. 【转载】JVM能够开启多少线程
  3. Siri的兄弟Viv可能带来下一个人工智能的革命
  4. MySQL8使用with recursive实现递归
  5. 112123---123456
  6. 如何用英文说明一种方法的优缺点(优点和缺点)
  7. srm软件非生产采购的解决方案
  8. python内置函数 blool()
  9. Android调用相机预览黑屏app passed NULL surface解决
  10. 编译小度deng wifi源码出错