239. 滑动窗口最大值(困难)

核心思想
主要包含两个动作

nums[i]进 和 nums[i-k]
新元素进入窗口旧元素移出窗口
最大值是谁这个区间各个元素都有可能
所以用一个set记录窗口的值,自定义排序从大到小,每次拿第一个就是最大值
同时用map记录数字出现次数,为0则移出set。

代码

class Solution {
    public int[] maxSlidingWindow(int[] nums, int k) {
        TreeSet<Integer> st = new TreeSet<>(new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                return o2-o1;
            }
        });
        HashMap<Integer,Integer> v = new HashMap<>();
        int[] res = new int[nums.length - k + 1];
        int resInd = 0;
        for(int i = 0; i < k; i++){
            st.add(nums[i]);
            v.put(nums[i], v.getOrDefault(nums[i], 0) + 1);
        }
        res[resInd++] = st.first();
        for(int i = k; i < nums.length; i++){
            int pre = nums[i - k];
            v.put(pre, v.get(pre) - 1);
            if(v.get(pre) == 0){
                v.remove(pre);
                st.remove(pre);
            }

            v.put(nums[i], v.getOrDefault(nums[i], 0) + 1);
            st.add(nums[i]);

            res[resInd++] = st.first();

        }
        return res;
    }
}
posted @ 2024-04-01 16:48  Shie1d  阅读(14)  评论(0)    收藏  举报