2020.12.17

1.无重复字符的最长子串(leetcode3)

思路:使用滑动窗口机制

设置右指针移动,其实就是一个队列,比如例题中的 abcabcbb,进入这个队列(窗口)为 abc 满足题目要求,当再进入 a,队列变成了 abca,这时候不满足要求。所以,我们要移动这个队列!

如何移动?我们只要把队列的左边的元素移出就行了,直到满足题目要求!

一直维持这样的队列,找出队列出现最长的长度时候,求出解!

public int lengthOfLongestSubstring(String s) {//HashMap<Character, Integer> map = new HashMap<>();int[] map = new int[128];//使用int数组可以当做map使用int maxLen = 0;//用于记录最大不重复子串的长度int left = 0;//滑动窗口左指针for (int i = 0; i < s.length() ; i++){/**1、首先,判断当前字符是否包含在map中,如果不包含,将该字符添加到map(字符,字符在数组下标),此时没有出现重复的字符,左指针不需要变化。此时不重复子串的长度为:i-left+1,与原来的maxLen比较,取最大值;2、如果当前字符 ch 包含在 map中,此时有2类情况:1)当前字符包含在当前有效的子段中,如:abca,当我们遍历到第二个a,当前有效最长子段是 abc,我们又遍历到a,那么此时更新 left 为 map.get(a)+1=1,当前有效子段更新为 bca;2)当前字符不包含在当前最长有效子段中,如:abba,我们先添加a,b进map,此时left=0,我们再添加b,发现map中包含b,而且b包含在最长有效子段中,就是1)的情况,我们更新 left=map.get(b)+1=2,此时子段更新为 b,而且map中仍然包含a,map.get(a)=0;随后,我们遍历到a,发现a包含在map中,且map.get(a)=0,如果我们像1)一样处理,就会发现 left=map.get(a)+1=1,实际上,left此时应该不变,left始终为2,子段变成 ba才对。为了处理以上2类情况,我们每次更新left,left=Math.max(left , map.get(ch)+1).另外,更新left后,不管原来的 s.charAt(i) 是否在最长子段中,我们都要将 s.charAt(i) 的位置更新为当前的i,因此此时新的 s.charAt(i) 已经进入到 当前最长的子段中!*///if(map.containsKey(s.charAt(i)))if (map[s.charAt(i)] != -1){left = Math.max(left, map[s.charAt(i)]+1);//left = Math.max(left , map.get(s.charAt(i))+1);}//不管是否更新left,都要更新 s.charAt(i) 的位置!map.put(s.charAt(i) , i);maxLen = Math.max(maxLen , i-left+1);}return maxLen;
}

2.最小覆盖子串(leetcode76)

思路:使用滑动窗口机制

  1. 设置右指针right移动,使滑动窗口增大,直到窗口包含了T的所有元素。
  2. 不断增加左指针left使滑动窗口缩小,并查看窗口是否包含所有元素。如果满足则记录此时滑动窗口的长度,并保存最小值
  3. left再增加一个位置,这个时候滑动窗口肯定不满足条件了,那么继续从步骤一开始执行,寻找新的满足条件的滑动窗口,如此反复,直到right超出了字符串S范围。

其中,需要注意的是:判断是否包含所有元素的方法是利用两个hashmap集合实现(也可以直接用数组表示),key为字符,value为字符的次数。满足条件对应的是window集合中元素个数要大于等于need集合中元素个数,在这里利用valid来判断是否满足条件。


class Solution {public String minWindow(String s, String t) {if (s == null || s.length() < t.length())return "";HashMap<Character, Integer> need = new HashMap<>();HashMap<Character, Integer> window = new HashMap<>();for (Character ch : t.toCharArray()) {need.put(ch, need.getOrDefault(ch,0)+1);}int left = 0;int valid = 0;int len = Integer.MAX_VALUE;int start = 0;for (int right=0;right<s.length();right++) {Character c1 = s.charAt(right);if (need.containsKey(c1)) {window.put(c1, window.getOrDefault(c1,0)+1);if (need.get(c1).equals(window.get(c1))) {valid++;}}while (valid == need.size() && left<=right) {if (right-left<len) {start = left;len = right-left+1;}Character c2 = s.charAt(left);if (need.containsKey(c2)) {window.put(c2, window.getOrDefault(c2,0)-1);if (window.get(c2) < need.get(c2)) {valid--;}}left++;}}return len==Integer.MAX_VALUE ? "" : s.substring(start, start+len);}
}

3.滑动窗口最大值(leetcode239)

思路:使用单调递减栈实现,即双端队列。

  1. 遍历数组,将数组对应的下标存入队列中。
  2. 数组需要按照数(即下标对应数组中的值)从大到小排列,如果当前遍历的数比队尾的值大,则需要弹出队尾值,直到队列重新满足从大到小的要求。
  3. 每次取队列头部即窗口最大值。如果头部位置已经超出窗口左边界的话,则移除头部。
class Solution {public int[] maxSlidingWindow(int[] nums, int k) {if(nums == null || nums.length < 2) return nums;// 双向队列 保存当前窗口最大值的数组位置 保证队列中数组位置的数值按从大到小排序LinkedList<Integer> queue = new LinkedList();// 结果数组int[] result = new int[nums.length-k+1];// 遍历nums数组for(int i = 0;i < nums.length;i++){// 保证从大到小 如果前面数小则需要依次弹出,直至满足要求while(!queue.isEmpty() && nums[queue.peekLast()] <= nums[i]){queue.pollLast();}// 添加当前值对应的数组下标queue.addLast(i);// 判断当前队列中队首的值是否有效if(queue.peek() <= i-k){queue.poll();   } // 当窗口长度为k时 保存当前窗口中最大值if(i+1 >= k){result[i+1-k] = nums[queue.peek()];}}return result;}
}

2020.12.17相关推荐

  1. 2020/12/17 ubuntu16.04 NTP时间同步配置

    ntp时间同步,大体步骤是将服务器端和客户端配置好,然后设定同步的频率,记得重新运行ntp服务,重启即可. 步骤总结如下: 一 服务器端(server) 1. 安装ntp与ntpdate $ sudo ...

  2. 2020.12.17 SQL注入

    SQL注入1-5题 ELECT VERSION() -- mysql版本 SELECT USER() -- mysql数据库的用户名 SELECT DATABASE() -- 当前数据库SELECT ...

  3. 2020.12.17 ps临摹

    欢迎观看阿贝贝啊的今日成果 今天上课临摹了两张图 感谢观看阿贝贝啊的今日划水 日常

  4. STEMA 考试每日一练 2020.12.7 - 2021.11.30 试题及答案 - 刷题

    2020.12.7 在以下几个选项中,正确的从小到大的排序是( ) A 地球<太阳系<可观测宇宙<银河系B 地球<太阳系<银河系<可观测宇宙C 太阳系<地球& ...

  5. 【不忘初心】Win10_20H2_2009_19042.662_X64_六合一_[纯净精简版][2.72G](2020.12.8)

    母版来自MSDN WIN10_20H2.19042.508,集成补到19042.662,20H2相比1909 2004版本要稳定很多,此版修复了上次的一些问题,精简方法基本上还是原来配方,为了保证稳定 ...

  6. 2020.12.21-12.28 人工智能行业每周技术动态

    本周是2020年的最后一周,还有3天,2020年就将画上句号. 这一年的计划,大家都完成了吗? 因为疫情的原因,很多人都感觉时间太短,一晃就到了年末,又到了为新的一年做规划的时间了. 大白也在反思,这 ...

  7. 2020年 第11届 蓝桥杯 Java B组 省赛真题详解及小结【第2场省赛 2020.10.17】

    蓝桥杯 Java B组 省赛真题详解及小结汇总[2013年(第4届)~2020年(第11届)] 说明:大部分题解思路及程序代码 源自 蓝桥杯 官网视频(Java B组历年真题解析) -- 郑未老师. ...

  8. 2020.12.28-2021.1.4 人工智能行业每周技术动态

    昨天是2021年的第一个工作日,不知大家是否做好了进入新的一年的准备? 在工作上,在学习上,在精神上,是否有一个全新的状态? 元旦的时候,有小伙伴和大白说,新的一年,想尝试很多事情,但是不知道如何学习 ...

  9. 1+X Web前端等级考证 | 2020 12月Web前端开发中级实操 (模拟试题第一套) 附答案

    由于经常分享失败,我上传github上了,先放上链接:https://github.com/Lydever/web-1-x.git 请礼貌,不要耍流氓哈哈,创作不易,下载的同时,请start一下,谢谢 ...

最新文章

  1. 车路协同让城市更智慧
  2. (11)Spring Boot配置ContextPath【从零开始学Spring Boot】
  3. java 公共组件_【JAVA语言程序设计基础篇】--Swing GUI组件的公共特性
  4. python库的使用手册_​Python 常用库之 psutil 使用指南
  5. C# 实现Winform全屏后不遮挡任务栏,显示任务栏
  6. 使用adb调试android
  7. GCC 生成的符号表调试信息剖析
  8. Pycharm 2019 添加 docker 解释器
  9. docker exec 权限问题,准成,亲自验证过,成功!!!
  10. “通讯录不属于用户隐私”?今日头条:绝对不认可这个说法
  11. 使用 Spring Boot Security 进行安全控制
  12. idea上安卓 Android SDK的安装
  13. 大专生自学web前端到找到工作的经验
  14. 浅谈三种使用Redis实现MQ的方式
  15. HiC软件安装篇之Lachesis
  16. Jenkins指定maven打包命令
  17. C语言编程-随机步法的实现
  18. 小提琴统计图_箱形图和小提琴图
  19. java后台如何将rgb与16进制颜色进行转换
  20. node版本、npm版本随意切换

热门文章

  1. 面向对象的设计模式及魔术函数
  2. PHP中date函数月和日带0问题
  3. 使用Pylint进行Python代码规范检查
  4. 第一次使用HP-UX时用到的命令
  5. except but
  6. [转]DICOM医学图像处理:Deconstructed PACS之Orthanc
  7. 使用UISearchDisplayController
  8. 运行管理员线程和用户线程小练习
  9. 让你的AIR程序脱离AIR环境运行
  10. 非常好的JavaScript学习资源推荐