手機(jī)算命網(wǎng)站建設(shè)wordpress手機(jī)端底部菜單
鶴壁市浩天電氣有限公司
2026/01/24 15:48:56
手機(jī)算命網(wǎng)站建設(shè),wordpress手機(jī)端底部菜單,網(wǎng)站建設(shè)程序有哪些,全屋整裝定制209. 長度最小的子數(shù)組 - 力扣#xff08;LeetCode#xff09; 分析#xff1a;這個(gè)題目是在滑動(dòng)窗口題目的類似題目中的#xff0c;所以最開始就是準(zhǔn)備用滑動(dòng)窗口來做的
這里用到了滑動(dòng)窗口的先進(jìn)先出#xff0c;但是要用數(shù)字和sum做更新#xff0c;所以我想到了隊(duì)列LeetCode分析這個(gè)題目是在滑動(dòng)窗口題目的類似題目中的所以最開始就是準(zhǔn)備用滑動(dòng)窗口來做的這里用到了滑動(dòng)窗口的先進(jìn)先出但是要用數(shù)字和sum做更新所以我想到了隊(duì)列但是在做題目的時(shí)候因?yàn)椴恢狸?duì)列可以有多長所以要用left和right來記錄隊(duì)列的開始和結(jié)束注意1我們只需要直到隊(duì)列的開始元素和結(jié)束元素的下標(biāo)并不需要直到中間存儲的數(shù)據(jù)換句話說中間的所有數(shù)據(jù)的下標(biāo)都是要放在隊(duì)列之中的是連續(xù)的所以并不需要隊(duì)列只需要記錄first和last就好了注意2既然用到了left和right那么就不用使用隊(duì)列了在寫的代碼里隊(duì)列是完全沒用到的的------所以寫完代碼要重新再看一遍是不是有冗余的部分存在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分析這個(gè)題是上一題的延申1.要注意到可能有重復(fù)的字母所以這里要單獨(dú)分析2.這里也是滑動(dòng)窗口但是并不需要用到隊(duì)列這里和上一題是一樣的3.這里只考慮字母出現(xiàn)了沒有并不考慮出現(xiàn)的順序---這個(gè)解法很巧的一個(gè)思路是用次數(shù),出現(xiàn)了幾次來判斷這樣子既可以判斷有沒有包含所有的又可以巧妙地化解重復(fù)字符的問題4.因?yàn)槠渲猩婕暗脚袛嗍欠瘳F(xiàn)在的子串滿足條件這個(gè)判斷要多次出現(xiàn)所以可以寫成方法5.這里的一個(gè)小巧思就是用字符的ASCII碼來做字符的判斷這樣就可以用數(shù)組了我最開始想到的是用map來做但是map會更麻煩很多要考慮到是否存在存在了再取出值加一刪除的時(shí)候也要取出值-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做的代碼運(yùn)行時(shí)間會高很多1.contained遍歷的時(shí)候一定是用tmap遍歷的而且要考慮不存在的情況2.在存放的時(shí)候要分開考慮已經(jīng)有的鍵和還沒有的鍵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; } }代碼思路學(xué)習(xí)靈茶山艾府 - 力扣LeetCode