一些数据结构使用记录

本文详细介绍了Java中的PriorityQueue及其在解决LeetCode滑动窗口最大值问题中的应用。讲解了如何创建和遍历优先队列,并通过二叉小顶堆的原理来理解其内部工作机制。此外,还展示了如何使用优先队列解决实际编程问题,例如找到数组中每个连续k个数的最大值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

优先队列

创建:

        PriorityQueue<int[]> pq = new PriorityQueue<int[]>(new Comparator<int[]>(){
            public int compare(int[] pair1, int[] pair2){
                return pair1[0] != pair2[0] ? pair2[0] - pair1[0] : pair2[1] - pair1[1];
            }
        });

遍历存放数组的值和下标(可以指定数量):

        for(int i = 0; i < k; i++){
            pq.offer(new int[]{nums[i],i});
        }
  • 使用
    队列是遵循先进先出(First-In-First-Out)模式的,但有时需要在队列中基于优先级处理对象。

  • 原理
    Java中PriorityQueue通过二叉小顶堆实现,可以用一棵完全二叉树表示(任意一个非叶子节点的权值,都不大于其左右子节点的权值)

  • 方法
    add()和offer(),插入失败时前者会抛出异常,后者会返回false
    element()和peek(),返回队顶元素,前者抛异常,后者返回null
    remove()和poll(),删除队首元素,前者抛异常,后者返回null
    remove(Object o),删除队列中跟o相等的某一个元素(如果有多个相等,只删除一个),该方法不是Queue接口内的方法,而是Collection接口的方法。

  • 例题
    https://leetcode-cn.com/problems/sliding-window-maximum/

class Solution {
    public int[] maxSlidingWindow(int[] nums, int k) {
        int n = nums.length;
        PriorityQueue<int[]> pq = new PriorityQueue<int[]>(new Comparator<int[]>(){
            public int compare(int[] pair1, int[] pair2){
                return pair1[0] != pair2[0] ? pair2[0] - pair1[0] : pair2[1] - pair1[1];
            }
        });
        for(int i = 0; i < k; i++){
            pq.offer(new int[]{nums[i],i});
        }
        int[] ans = new int[n-k+1];
        ans[0] = pq.peek()[0];
        for(int i = k; i < n; i++){
            pq.offer(new int[]{nums[i],i});
            while(pq.peek()[1] <= i - k){
                pq.poll();
            }
            ans[i-k+1] = pq.peek()[0];
        }
        return ans;     
    }
}

前k个最小数


把数字加到字符串数组里

 List<String> ans = new ArrayList<>();
   for(int i = 1;i <= n; i++){
   		String cur = "";
   		cur = i + "";
        ans.add(cur);
   }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值