【栈与队列part03】| 239.滑动窗口最大值、347.前K个高频元素

目录

✿LeetCode239.滑动窗口最大值❀

 ✿LeetCode347.前K个高频元素❀


✿LeetCode239.滑动窗口最大值❀

链接:239.滑动窗口最大值

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

返回 滑动窗口中的最大值 

【栈与队列part03】| 239.滑动窗口最大值、347.前K个高频元素_第1张图片 

这道题还是挺难的,用暴力会超时,我看了题解用单调队列,这队列和平常的还不一样,poll()也需要传参,我刚开始用Queue实现,发现不可以,不能保证单调性,最后还是用的Deque,大部分还是照着题解抄下来的,但是这也是一道困难题呀,对我来说也正常,下面的代码我也给出了注释,代码如下:

class Solution {
    public static int[] maxSlidingWindow(int[] nums, int k) {
//        用单调队列解决
        int len=nums.length-k+1;
        int[] result=new int[len];
        int j=0;
        MyQueue myQueue=new MyQueue();
//        先放入前k个元素
        for (int i = 0; i < k; i++) {
            myQueue.add(nums[i]);
        }
        result[j++] = myQueue.peek();
        for (int i = k; i < nums.length; i++) {
            //滑动窗口移除最前面的元素,移除是判断该元素是否放入队列
            myQueue.poll(nums[i - k]);
            //滑动窗口加入最后面的元素
            myQueue.add(nums[i]);
            //记录对应的最大值
            result[j++] = myQueue.peek();
        }
        return result;


    }
}
class MyQueue {
    Deque deque = new LinkedList<>();
    //弹出元素时,比较当前要弹出的数值是否等于队列出口的数值,如果相等则弹出
    //同时判断队列当前是否为空
    void poll(int val) {
        if (!deque.isEmpty() && val == deque.peek()) {
            deque.poll();
        }
    }
    //添加元素时,如果要添加的元素大于入口处的元素,就将入口元素弹出
    //保证队列元素单调递减
    //比如此时队列元素3,1,2将要入队,比1大,所以1弹出,此时队列:3,2
    void add(int val) {
        while (!deque.isEmpty() && val > deque.getLast()) {
            deque.removeLast();
        }
        deque.add(val);
    }
    //队列队顶元素始终为最大值
    int peek() {
        return deque.peek();
    }
}

 ✿LeetCode347.前K个高频元素❀

链接:347.前K个高频元素

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

【栈与队列part03】| 239.滑动窗口最大值、347.前K个高频元素_第2张图片 

虽然这题我已经写过一次,我也知道用小顶堆做,但还写不出代码,今天虽然只有两道题,但是用的时间可丝毫不少,代码如下:

public int[] topKFrequent(int[] nums, int k) {
        Map map = new HashMap<>();//key为数组元素值,val为对应出现次数
            for(int num:nums){
                map.put(num,map.getOrDefault(num,0)+1);
            }
            PriorityQueue pq = new PriorityQueue<>((pair1,pair2)->pair1[1]-pair2[1]);
            for(Map.Entry entry:map.entrySet()){
                if(pq.size()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;
        
    }  

你可能感兴趣的:(数学建模)