首页 > 其他分享 >代码随想录day13 | 滑动窗口最大值 前 K 个高频元素

代码随想录day13 | 滑动窗口最大值 前 K 个高频元素

时间:2023-02-27 22:56:17浏览次数:35  
标签:deque pq nums int 最大值 随想录 new day13 滑动

滑动窗口最大值

题目 :给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。返回 滑动窗口中的最大值 。

分析: 用单调队列, 单调队列特性  里面所有元素都是单调递增或递减, push()操作 while(队列不为空 且 x大于队尾元素) removeLast(). pop() 操作 if(队列不为空 且 x等于peek元素) poll()

代码如下

class MyDeque {
    Deque<Integer> deque = new LinkedList<>();
    public void push(int x){
        while(!deque.isEmpty()&&x>deque.peekLast()){
            deque.removeLast();
        }
        deque.offer(x);
    }

    public void pop(int x){
        if(!deque.isEmpty()&&x==deque.peek()){
            deque.poll();
        }
    }
    
    public int peek(){
        return deque.peek();
    }
}
class Solution {
    public int[] maxSlidingWindow(int[] nums, int k) {
        if(nums.length<2) return nums; 
        int[] res= new int[nums.length-k+1];
        int num=0;
        MyDeque myDeque= new MyDeque();
        for(int i =0;i<k;i++){
            myDeque.push(nums[i]);
        }
        res[num++]=myDeque.peek();

        for(int i=k;i<nums.length;i++){
            myDeque.pop(nums[i-k]);
            myDeque.push(nums[i]);
            res[num++]=myDeque.peek();
        }
        return res;
    }
}

前 K 个高频元素

题目 给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。

分析 用小顶堆(父节点小于左右节点  每次pop都是从头部pop)  维护k个元素

代码

class Solution {
    public int[] topKFrequent(int[] nums, int k) {
        Map<Integer, Integer> map = new HashMap<>();
        for(int num:nums){
            map.put(num,map.getOrDefault(num,0)+1);
        }

        PriorityQueue<int[]> pq = new PriorityQueue<>((i1,i2)->i1[1]-i2[1]);
        for(Map.Entry<Integer,Integer> entry:map.entrySet()){
            if(pq.size()<k){
                pq.add(new int[]{entry.getKey(),entry.getValue()});
            }else {
                if(entry.getValue()>pq.peek()[1]){
                    pq.poll();
                    pq.add(new int[]{entry.getKey(),entry.getValue()});
                }
            }
        }

        int[] ans = new int[k];
        for(int i=k-1;i>=0;i--){
            ans[i]=pq.poll()[0];
        }

        return ans;
    }
}

  

标签:deque,pq,nums,int,最大值,随想录,new,day13,滑动
From: https://www.cnblogs.com/Liu5419/p/17162276.html

相关文章