2026/3/2 17:30:51
网站建设
项目流程
ps制作博客网站界面,沈阳网站开发培训价格,网站信息评估抽查,企业网站制作要求209. 长度最小的子数组 - 力扣#xff08;LeetCode#xff09; 分析#xff1a;这个题目是在滑动窗口题目的类似题目中的#xff0c;所以最开始就是准备用滑动窗口来做的
这里用到了滑动窗口的先进先出#xff0c;但是要用数字和sum做更新#xff0c;所以我想到了队列LeetCode分析这个题目是在滑动窗口题目的类似题目中的所以最开始就是准备用滑动窗口来做的这里用到了滑动窗口的先进先出但是要用数字和sum做更新所以我想到了队列但是在做题目的时候因为不知道队列可以有多长所以要用left和right来记录队列的开始和结束注意1我们只需要直到队列的开始元素和结束元素的下标并不需要直到中间存储的数据换句话说中间的所有数据的下标都是要放在队列之中的是连续的所以并不需要队列只需要记录first和last就好了注意2既然用到了left和right那么就不用使用队列了在写的代码里队列是完全没用到的的------所以写完代码要重新再看一遍是不是有冗余的部分存在class Solution { public int minSubArrayLen(int target, int[] nums) { //DequeInteger queue new ArrayDeque(); int sum0; int left0,right0; boolean flagtrue; int ansnums.length1; while(rightnums.length){ while(sumtarget rightnums.length){ //queue.addLast(right); sumnums[right]; right; } while(sumtarget){ flagfalse; //queue.removeFirst(); sum-nums[left]; left; } ansMath.min(ans,right-left1); } if(flag) ans0; return ans; } }76. 最小覆盖子串 - 力扣LeetCode分析这个题是上一题的延申1.要注意到可能有重复的字母所以这里要单独分析2.这里也是滑动窗口但是并不需要用到队列这里和上一题是一样的3.这里只考虑字母出现了没有并不考虑出现的顺序---这个解法很巧的一个思路是用次数,出现了几次来判断这样子既可以判断有没有包含所有的又可以巧妙地化解重复字符的问题4.因为其中涉及到判断是否现在的子串满足条件这个判断要多次出现所以可以写成方法5.这里的一个小巧思就是用字符的ASCII码来做字符的判断这样就可以用数组了我最开始想到的是用map来做但是map会更麻烦很多要考虑到是否存在存在了再取出值加一删除的时候也要取出值-1class Solution { public String minWindow(String s, String t) { int[] tarrnew int[128]; int[] sarrnew int[128]; String subs; for(char c:t.toCharArray()){ tarr[c]; } boolean flagtrue; int left0,right0; while(rights.length()){ while (iscontened(tarr,sarr)) { if(sub.length() right-left){ subs.substring(left,right); } flagfalse; sarr[s.charAt(left)]--; left; } while (!iscontened(tarr,sarr) rights.length()){ sarr[s.charAt(right)]; right; } } while (iscontened(tarr,sarr) lefts.length()) { if(sub.length() right-left){ subs.substring(left,right); } flagfalse; sarr[s.charAt(left)]--; left; } if(flag) return ; return sub; } public static boolean iscontened(int[] tarr,int[] sarr){ for (int i 0; i tarr.length; i) { if(tarr[i]sarr[i]){ return false; } } return true; } }这是用map做的代码运行时间会高很多1.contained遍历的时候一定是用tmap遍历的而且要考虑不存在的情况2.在存放的时候要分开考虑已经有的键和还没有的键class Solution { public String minWindow(String s, String t) { MapCharacter, Integer tmap new HashMap(); MapCharacter, Integer smap new HashMap(); String subs; for(char c:t.toCharArray()){ if(tmap.containsKey(c)){ tmap.put(c,tmap.get(c)1); }else{ tmap.put(c,1); } } boolean flagtrue; int left0,right0; char c; while(rights.length()){ while (iscontened(tmap,smap)) { if(sub.length() right-left){ subs.substring(left,right); } flagfalse; cs.charAt(left); if(smap.containsKey(c)){smap.put(c,smap.get(c)-1);} left; } while (!iscontened(tmap,smap) rights.length()){ cs.charAt(right); if(smap.containsKey(c)){smap.put(c,smap.get(c)1);} else{smap.put(c,1);} right; } } while (iscontened(tmap,smap) lefts.length()) { if(sub.length() right-left){ subs.substring(left,right); } flagfalse; cs.charAt(left); if(smap.containsKey(c)){smap.put(c,smap.get(c)-1);} left; } if(flag) return ; return sub; } public static boolean iscontened(MapCharacter,Integer tmap,MapCharacter,Integer smap) { for (Map.EntryCharacter, Integer entry : tmap.entrySet()) { if (!smap.containsKey(entry.getKey())) { return false; }else if (entry.getValue() smap.get(entry.getKey())) { return false; } } return true; } }代码思路学习灵茶山艾府 - 力扣LeetCode