Vue Element-ui實現樹形控制元件節點新增圖示詳解
阿新 • • 發佈:2021-11-24
滑動視窗
import java.util.Arrays; class Solution { public String minWindow(String s, String t) { if (s.length() < t.length()){ return ""; } /** * 滑動視窗 * 用雜湊表陣列記錄t中每個字元在s中是否出現 * 右指標right一直右移,直到滿足條件,然後記錄下此時區間的邊界,如果長度更小則更新l和r */ int[] tCount = new int[128]; int right = -1; int l = 0; int r = -1; for (int i = 0; i < t.length(); i++) { tCount[t.charAt(i)]++; } /** * 左指標i從0開始,只有當區間包含所有t的字元後才會移動 */ for (int i = 0; i < s.length() - t.length() + 1; i++) { /** * 只要區間沒有完全包含t的元素,右指標right就不斷移動 * 同時right不能越界 * 每次迴圈都要找出陣列的最大值,時間複雜度為O(n^2) */ while (Arrays.stream(tCount).max().getAsInt() > 0 && right < s.length() - 1){ right++; tCount[s.charAt(right)]--; } /** * 只有當包含t的所有字元且區間長度更小且r < l時才會更新 */ if (Arrays.stream(tCount).max().getAsInt() == 0) { if (r < l) { r = right; l = i; } else if (r - l + 1 > right - i + 1){ r = right; l = i; } } /** * 在左指標移動之前,要拋棄掉當前字元 */ tCount[s.charAt(i)]++; } return s.substring(l, r + 1); } } /** * 時間複雜度 O(n^2) * 空間複雜度 O(1) */
優化1——不用每次都找出陣列最大值,同時簡化判斷條件
import java.util.Arrays; class Solution { public String minWindow(String s, String t) { if (s.length() < t.length()){ return ""; } /** * 滑動視窗 * 用雜湊表陣列記錄t中每個字元在s中是否出現 * 右指標right一直右移,直到滿足條件,然後記錄下此時區間的邊界,如果長度更小則更新l和r */ int[] tCount = new int[128]; int num = t.length(); int right = -1; int l = 0; int r = -1; for (int i = 0; i < t.length(); i++) { tCount[t.charAt(i)]++; } /** * 左指標i從0開始,只有當區間包含所有t的字元後才會移動 */ for (int i = 0; i < s.length() - t.length() + 1; i++) { /** * 只要區間沒有完全包含t的元素,右指標right就不斷移動 * 同時right不能越界 * 使用一個變數num同步記錄t中字元出現的次數,當次數大於0時才減1,這樣就不用每次都比較tCount的最大值了 */ while (num > 0 && right < s.length() - 1){ right++; if (tCount[s.charAt(right)] > 0) { num--; } tCount[s.charAt(right)]--; } /** * 只有當包含t的所有字元且區間長度更小且r < l時才會更新 */ if (num == 0 && (r < l || r - l + 1 > right - i + 1)) { r = right; l = i; } /** * 在左指標移動之前,要拋棄掉當前字元,同時維護num * 如果這個字元的次數是負數,說明其不在t中,num就不用更新 */ if (tCount[s.charAt(i)] == 0) { num++; } tCount[s.charAt(i)]++; } return s.substring(l, r + 1); } } /** * 時間複雜度 O(n) * 空間複雜度 O(1) */