当前位置:   article > 正文

【LeetCode14种套路】一、滑动窗口_leecode 有一个聊天窗口

leecode 有一个聊天窗口

前言

大家好,我是春风。

今天开始学习leetcode套路一:滑动窗口​。

问题特点

  1. 输入是一种线性数据结构,比如链表、数组、字符串
  2. 需要查找最短/最长子串、子数组或所需的值
  3. 问题示例:
  4. 给两个字符串,一长一短,求长的的最短子串,该子串必须涵盖短的的所有字符
  5. 给一个数组,求大小为K的子数组的最大和
  6. 给一个字符串,求无重复字符的最长子串
  7. ......

求解特点

  1. 需要双指针一前一后夹着进行遍历,并对当前窗口元素做条件判断,决定是否移动相应指针。一般可解决
  2. 嵌套循环问题,时间复杂度由O(n^2)降为O(n),空间复杂度O(n)

模板

  1. 右指针每次移动一格,保证每次有一个新元素进入窗口,左指针根据当前窗口数值是否满足条件来决定是否
  2. 移动以及移动多少格,同时记录下每次的结果以及其他中间结果
  1. // 输入参数校验
  2. if (...) {
  3. ...
  4. }
  5. // 创建一个数组,用于记录当前滑动窗口元素或者其他中间结果
  6. Set<Character> set = new HashSet<>();
  7. // 预处理,一般给上面的数组预设值,比如求K个大小的子数组,先预设数组前K个元素到上面的数组
  8. ...
  9. // 设置left左指针、中间结果、最终结果等
  10. int left = 0;
  11. ...
  12. for(int i=0; i<args.length; i++){
  13. // 窗口添加新元素
  14. set.add(args[i]);
  15. // 根据新窗口元素的变化改变中间结果的值
  16. ...
  17. // 条件判断左指针的移动
  18. if (...) {
  19. left ++; // 或者移动到指定位置
  20. }
  21. // 更新结果
  22. ...
  23. }

leetcode例题

  1. 给定一个数组,求大小为K的子数组的最大和
  1. int maxSum(int[] nums, int k) {
  2. // 参数校验
  3. if (nums == null || nums.length < k) {
  4. throw new Exception("入参错误!");
  5. }
  6. int maxSum = 0;
  7. // 预设结果
  8. for (int i=0; i<k; i++) {
  9. maxSum += nums[i];
  10. }
  11. // 中间结果
  12. int winSum = maxSum;
  13. for (int i=k, i<nums.length; i++) {
  14. winSum = winSum + nums[i] - nums[i-k];
  15. }
  16. maxSum = Math.max(maxSum, winSum);
  17. }
  1. 给定一个字符串,求无重复字符的最长子串
  1. String str = "";
  2. // 记录字符最新出现的位置
  3. Map<Character, Integer> map = new HashMap<>();
  4. int left = 0, maxLen = 0;
  5. for (int i=0; i<str.length(); i++) {
  6. if (map.containsKey(str.charAt(i))) {
  7. // 出现重复元素,左指针直接移动到上一个该重复元素的+1位置
  8. // 使用max,避免类似abba这种情况,在遍历到b时,已经移到最后,但是到a又移回去的情况
  9. left = Math.max(left, map.get(str.charAt(i)) + 1);
  10. }
  11. maxLen = Math.max(maxLen, i-left+1);
  12. map.put(str.charAt(i), i);
  13. }
  1. 给定一个字符串 s 和
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/276856
推荐阅读
相关标签
  

闽ICP备14008679号