【代码随想录训练营】Day13-栈与队列

代码随想录 Day13

今日任务

239.滑动窗口最大值
347.前K个高频元素
栈与队列总结
语言:Java

239. 滑动窗口最大值

链接:https://leetcode.cn/problems/sliding-window-maximum/

class MyQueue{
    Deque<Integer> deque = new LinkedList<Integer>();
    public void pop(int value){
        if(!deque.isEmpty() && this.front() == value){
            deque.remove();
        }
    }
    public void push(int value){
        //deque中元素单调递减排序
        //每次加入新元素时,要将其前面所有比它小的元素都弹出
        //eg. 3 1 2,插入2时要把1弹出
        while(!deque.isEmpty() && deque.getLast() < value){
            deque.removeLast();
        }
        deque.add(value);
    }
    //front永远是当前窗口中最大元素
    public int front(){
        return deque.peek();
    }
}

class Solution {
    public int[] maxSlidingWindow(int[] nums, int k) {
        MyQueue mq = new MyQueue();
        int[] result = new int[nums.length - k + 1];
        int ridx = 0;
        for(int i = 0; i < k; i++){
            mq.push(nums[i]);
        }
        result[ridx++] = mq.front();
        for(int i = k; i < nums.length; i++){
            //通过nums[i-k]来控制滑动窗口左边界
            mq.pop(nums[i - k]);
            mq.push(nums[i]);
            result[ridx++] = mq.front();
        }
        return result;
    }
}

347. 前K个高频元素

链接:https://leetcode.cn/problems/top-k-frequent-elements/
参考代码随想录
注意事项:这道题使用的是小顶堆而非大顶堆,因为小顶堆每次弹出的是当前最小元素,也就是当前出现频次最小的元素,最终二叉树中留下的就是出现频次最大的k个元素。
使用大顶堆需要维护所有元素的顺序,使用小顶堆只需要维护k个元素的顺序:
使用大顶堆的时间复杂度:O(klogN)
使用小顶堆的时间复杂度:O(Nlogk)

class Solution {
    public int[] topKFrequent(int[] nums, int k) {
        //因为参数是个数为2的数组,所以要写名比较方式
        //小顶堆:参数1-参数2
        //大顶堆:参数2-参数1
        Queue<int[]> pq = new PriorityQueue<>((pair1, pair2)->pair1[1]-pair2[1]);
        HashMap<Integer, Integer> hm = new HashMap<Integer, Integer>();
        for(int num: nums){
            hm.put(num, hm.getOrDefault(num, 0) + 1);
        }
        for(Map.Entry<Integer, Integer> entry: hm.entrySet()){
            if(pq.size() == k){
                if(pq.peek()[1] < entry.getValue()){
                    pq.poll();
                    pq.add(new int[]{entry.getKey(), entry.getValue()});
                }
            }
            else{
                pq.add(new int[]{entry.getKey(), entry.getValue()});
            }
        }
        int[] result = new int[k];
        for(int i = k - 1; i >= 0; i--){
            result[i] = pq.peek()[0];
            pq.poll();
        }
        return result;
    }
}

你可能感兴趣的:(代码随想录训练营,java,leetcode)