代码随想录训练营 day13|LeetCode239|LeetCode347

LeetCode 239 滑动窗口的最大值

这里我们使用双端队列来辅助我们完成滑动窗口的移动,我们用这个双端队列来储存最大值在数组中的位置。这样我们能够清除的知道这个位置是否处于滑动窗口当中。

在循环的过程中,我们往双端队列中增加数据时,我们需要首先判断目前的最大值是否在滑动窗口的范围中,如果不在我们需要从双端队列的尾部移除该元素。

然后我们需要判断这个值和双端队列首部的元素依次比较大小,如果前面的数比该数要小,则从双端队列首部移除元素,直至双端队列中没有元素或者前面的元素要大于该增加元素。

从首部增加元素,最后把双端队列中的结果储存到结果中

class Solution {
    public int[] maxSlidingWindow(int[] nums, int k) {
        ArrayDeque<Integer> deque = new ArrayDeque<>();
        int n = nums.length;
        int[] res = new int[n - k + 1];
        int idx = 0;
        for(int i=0;i<n;i++){
            while(!deque.isEmpty() && deque.peek()<i-k+1){
                deque.poll();
            }
            while(!deque.isEmpty()&&nums[deque.peekLast()]<nums[i]){
                deque.pollLast();
            }
            deque.offer(i);
            if(i>=k-1){
                res[idx++] =nums[deque.peek()];
            }
        }
        return res;
    }
}

LeetCode 347 前K个高频元素

这题主要考察了对于大顶堆和小顶堆的理解和使用。

建议每天都做1-2题大顶堆和小顶堆

    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<>((pair1,pair2)->(pair2[1]-pair1[1]));
        for(Map.Entry<Integer,Integer> entry:map.entrySet()){
            pq.add(new int[]{entry.getKey(),entry.getValue()});
        }
        int[] ans = new int[k];
        for(int i=0;i<k;i++){
            ans[i] = pq.poll()[0];
        }
        return ans;
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值