Sliding window template

Sliding window template

// 模板一
/* 滑动窗口算法框架 */
void slidingWindow(string s, string t) {
    
    
    unordered_map<char, int> need, window;
    for (char c : t) need[c]++;

    int left = 0, right = 0;
    int valid = 0; 
    while (right < s.size()) {
    
    
        // c 是将移入窗口的字符
        char c = s[right];
        // 右移窗口
        right++;
        // 进行窗口内数据的一系列更新
        ...

        /*** debug 输出的位置 ***/
        printf("window: [%d, %d)\n", left, right);
        /********************/

        // 判断左侧窗口是否要收缩
        while (window needs shrink) {
    
    
            // d 是将移出窗口的字符
            char d = s[left];
            // 左移窗口
            left++;
            // 进行窗口内数据的一系列更新
            ...
        }
    }
}
// 模板二
 public int[] maxSlidingWindow(int[] nums, int k) {
    
    
        if(nums == null || nums.length == 0) {
    
    
            return new int[0];
        } else if(k == 1) {
    
    
            return nums;
        }
        Deque<Integer> queue = new LinkedList<>();
        int[] res = new int[nums.length - k + 1];
        for(int i = 0, j = 0; i < nums.length; ++i) {
    
    
            if(!queue.isEmpty() && queue.peek() < i - k + 1) {
    
    
                queue.poll();;
            }
            while(!queue.isEmpty() && nums[i] > nums[queue.peekLast()]) {
    
    
                queue.removeLast();
            }
            queue.addLast(i);
            if(i >= k - 1) {
    
    
                res[j++] = nums[queue.peek()];
            }
        }

        return res;
    }
    ```

Guess you like

Origin blog.csdn.net/Justdoforever/article/details/113799348