代码随想录Day13

239.滑动窗口最大值

题目:239. 滑动窗口最大值 - 力扣(LeetCode)

思路:把每个数字记录下来,然后找出最大的不久行了嘛,就是每次取出窗口内的最大值,存入到一个数组中

尝试
class Solution {
    public int[] maxSlidingWindow(int[] nums, int k) {
        int[] result = new int[nums.length];
        int start = 0;
        int end = k-1;
        int count = 0;
        for(;k-1<nums.length;k++){
            result[count] =  getMax(start,k,nums);
            count++;
            start++;
        }
        return result;
    }
    public int getMax(int start,int end,int[] nums){
        if (nums == null || start < 0 || end >= nums.length || start > end) {
            throw new IllegalArgumentException("Invalid arguments");
        }
        
        int max = Integer.MIN_VALUE; // 初始化为最小可能的整数
        // 遍历窗口内的元素,找到最大值
        for (int i = start; i <= end; i++) {
            if (nums[i] > max) {
                max = nums[i];
            }
        }
        return max;
    }
}
429 看视频后

🍉视频里推导时,队列里存的是元素,代码中存的是元素索引!

🍉判断头部元素时,要用【i - k + 1】,而不是[ n - k + 1] 

429晚上

🍉从队列中取出的是索引!所以要用nums[ ]去找到元素再比较大小 

小结
  1. ArrayDeque 是一个基于数组实现的双端队列
  2. ArrayDeque<Integer> deque = new ArrayDeque<>(); // 创建一个整型的双端队列
    
    deque.peekLast(); // 查看队列尾部的元素,但不移除它。如果队列为空,返回null。
    
    deque.pollLast(); // 移除并返回队列尾部的元素。如果队列为空,返回null。
    
    int i = 10; // 假设我们有一个整数值i
    
    deque.offer(i); // 将元素i添加到队列尾部。如果成功,返回true。
    
    deque.poll(); // 移除并返回队列头部的元素。如果队列为空,返回null。
    
    deque.peek(); // 查看队列头部的元素,但不移除它。如果队列为空,返回null。
  3. 双端队列,一个while循环保证队列的头节点在窗口内,一个while循环保证放进去的数字比末尾都大
  4. 第一个窗口之后,每滑动一步,就把列表头节点存入在结果集中

347.前K个高频元素

题目:347. 前 K 个高频元素 - 力扣(LeetCode)

思路:先存在队列里面,最后用for循环弹出K次,存入到结果数组中。——存在队列时,用单调队列吗?还是说用自带排序的队列?但是排序是按照元素来排的,我不能往里面直接存元素或者是索引。用元素和出现次数组成键值对,搞个优先级队列,队列里面放入次数,也不对。

我排序的时候,用的是频率,返回的时候,要返回元素,所以两者应该有个映射表,或者是我直接按次序插入到数组中,大的放前面,小的放后面。

🍕怎么解决排序值与返回值的映射?🍉用map,就是键值对!

🍕Java中怎么实现优先级队列? 

小结
  • 🍉Java的优先级队列是priorityQueue
  • 定义存放数组的优先级队列,数组长度为2,用于存储元素、元素出现频率
  • for循环,遍历传入的数组,记录所有元素出现的频率到map中
  • for循环,遍历map,把键值对转化为数组,存入优先级队列中,通过if函数,保证队列只有k个元素
  • for循环,取出优先级队列中的元素,赋值给结果数组返回

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值