Leetcode 查找和最小的 K 对数字

java 实现

java 复制代码
class Solution {
    public List<List<Integer>> kSmallestPairs(int[] nums1, int[] nums2, int k) {
        //首先创建一个存储结果的二维数组
        List<List<Integer>> result = new ArrayList<>();
        //特殊情况处理
        if(nums1 == null || nums2 == null || nums1.length == 0 || nums2.length == 0) {
            return result;
        }

        //然后初始化优先队列, 
        //其中a[0] b[0]是数对中第一个数字在数组 nums1 中的索引, a[1] b[1]是数对中第二个数字在数组 nums2 中的索引
        PriorityQueue<int[]> minHeap = new PriorityQueue<>((a, b) -> (nums1[a[0]] + nums2[a[1]]) - (nums1[b[0]] + nums2[b[1]]));
        //初始化堆,先让 nums1 的前 k 个元素和 nums2[0] 配对加入堆
        for(int i = 0; i < Math.min(nums1.length, k); i++) {
            minHeap.offer(new int[]{i, 0});
        }

        //然后取出前 k 小的数对
        while(k-- > 0 && !minHeap.isEmpty()) {
            //堆顶元素出队
            int[] pair = minHeap.poll();
            int i = pair[0], j = pair[1];

            List<Integer> currentPair = new ArrayList<>();
            currentPair.add(nums1[i]);
            currentPair.add(nums2[j]);
            result.add(currentPair);

            //如果 nums2 中还有下一个元素, 加入堆
            //这一部分代码片段在往堆中添加元素时,会根据最小堆设定的规则动态调整堆的堆顶元素位置
            //所以上面初始化堆时,先让 nums1 的前 k 个元素和 nums2[0] 配对加入堆也会得到正确的结果。
            if(j + 1 < nums2.length) {
                minHeap.offer(new int[]{i, j + 1});
            }
        }

        return result;

        
    }
}
相关推荐
云里雾里!21 小时前
力扣 209. 长度最小的子数组:滑动窗口解法完整解析
数据结构·算法·leetcode
屿行屿行21 小时前
【Linux】Socket编程(基于实际工程分析)
linux·服务器·网络
天才程序YUAN21 小时前
从零开始、保留 Windows 数据、安装Ubuntu 22.04 LTS双系统
linux·windows·ubuntu
Evan芙1 天前
Rocky Linux 9 网卡改名及静态IP地址配置完整步骤
linux·网络·智能路由器
Zeku1 天前
20251125 - 韦东山Linux第三篇笔记【上】
linux·笔记·单片机
CoderYanger1 天前
递归、搜索与回溯-穷举vs暴搜vs深搜vs回溯vs剪枝:12.全排列
java·算法·leetcode·机器学习·深度优先·剪枝·1024程序员节
企鹅侠客1 天前
Linux性能调优 详解磁盘工作流程及性能指标
linux·运维·服务器·性能调优
icy、泡芙1 天前
TF卡---热插拔
linux·驱动开发
企鹅侠客1 天前
Linux性能调优 再谈磁盘性能指标和进程级IO
linux·运维·服务器·性能调优
憨憨崽&1 天前
进击大厂:程序员必须修炼的算法“内功”与思维体系
开发语言·数据结构·算法·链表·贪心算法·线性回归·动态规划