核心思想
主要包含两个动作
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;
}
}
标签:pre,nums,int,res,最大值,st,239,new,滑动
From: https://www.cnblogs.com/ganyq/p/18108851