1. 程式人生 > 程式設計 >Vue Element-ui實現樹形控制元件節點新增圖示詳解

Vue Element-ui實現樹形控制元件節點新增圖示詳解

滑動視窗

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)
 */

https://leetcode-cn.com/problems/minimum-window-substring/