代码随想录算法训练营第13天|239. 滑动窗口最大值 、347.前 K 个高频元素

60 阅读1分钟

今日内容: 

●  239. 滑动窗口最大值

●  347.前 K 个高频元素

今天还是栈和队列的练习,这两道题都是高频题

239. 滑动窗口最大值

定义一个单调递减队列,然后填充这个自定义队列,然后从i=k开始遍历即可

class Solution {
    class MyQueue {
        Deque<Integer> deque;
        public MyQueue(){
            deque = new LinkedList<>();
        }
        private void add(int num) {
            while(!deque.isEmpty() && deque.peekLast() < num) {
                deque.removeLast();
            }
            deque.addLast(num);
        }
        private void poll(int num) {
            if(!deque.isEmpty() && deque.peekFirst() == num) {
                deque.removeFirst();
            }
        }
        private int peek() {
            return deque.peekFirst();
        }
        private boolean isEmpty() {
            return deque.isEmpty();
        }
    }
    public int[] maxSlidingWindow(int[] nums, int k) {
        if(nums == null || nums.length == 0)return new int[0];
        if(nums.length == 1)return nums;
        int len = nums.length;
        int[] res = new int[len - k + 1];
        MyQueue myQueue = new MyQueue();
       
        for(int i = 0; i < k; i++) {
            myQueue.add(nums[i]);
        }
        int index = 0;
        res[index++] = myQueue.peek();
        for(int i = k; i < len; i++) {
            myQueue.poll(nums[i-k]);
            myQueue.add(nums[i]);
            res[index++] = myQueue.peek();
        }
        return res;
    }
}

347. 前 K 个高频元素

这道题可以用优先队列也就是堆,也可以用快速排序来做 我在这里用优先队列来做

class Solution {
    public int[] topKFrequent(int[] nums, int k) {
        //统计频率
        HashMap<Integer, Integer> map = new HashMap<>();
        for(int num : nums) {
            if(map.containsKey(num)) {
                map.put(num, map.get(num) + 1);
            } else {
                map.put(num, 1);
            }
        }
        //构建小顶堆
        PriorityQueue<Integer> pq = new PriorityQueue<>(new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                return map.get(o1) - map.get(o2);
            }
        });
        for(int key : map.keySet()) {
            if(pq.size() < k) {
                pq.add(key);
            } else if(map.get(key) > map.get(pq.peek())) {
                pq.remove();
                pq.add(key);
            }
        }
        //转换为数组
        int[] res = new int[k];
        int i = 0;
         while (!pq.isEmpty()) {
            res[i++] = pq.remove();
        }
        return res;
    }
}