LeetCode 373 查找和最小的 K 对数字题解

LeetCode 373 查找和最小的 K 对数字题解

题目描述

给定两个以升序排列的整数数组 nums1 和 nums2,以及一个整数 k。定义一对值 (u,v),其中第一个元素来自 nums1,第二个元素来自 nums2。请找到和最小的 k 个数对。

解题思路

最小堆优化法

  1. 初始候选集:将nums1每个元素与nums2第一个元素组合
  2. 堆维护:使用最小堆动态维护候选对
  3. 结果收集:每次取出堆顶元素后补充新的候选对

核心逻辑

  1. 堆元素结构:(sum, i, j) 存储当前和、nums1索引、nums2索引
  2. 避免重复:通过索引递增保证每个组合只处理一次
  3. 提前终止:当收集够k个结果或堆为空时停止

复杂度分析

操作 时间复杂度 空间复杂度
堆初始化 O(klogk) O(k)
堆弹出/压入 O(klogk) O(k)
总复杂度 O(klogk) O(k)

测试用例

常规测试

输入:

python 复制代码
nums1 = [1,7,11]
nums2 = [2,4,6] 
k = 3

```python
# LeetCode 373 查找和最小的 K 对数字
# https://leetcode.cn/problems/find-k-pairs-with-smallest-sums/description/

import heapq
from typing import List

class Solution:
    def kSmallestPairs(self, nums1: List[int], nums2: List[int], k: int) -> List[List[int]]:
        """
        解法:最小堆 + 双指针
        时间复杂度:O(klogk)
        空间复杂度:O(k)
        """
        if not nums1 or not nums2:
            return []
        
        heap = []
        # 初始化堆:将nums1中每个元素与nums2第一个元素组合
        for i in range(min(len(nums1), k)):
            heapq.heappush(heap, (nums1[i] + nums2[0], i, 0))
        
        result = []
        while heap and len(result) < k:
            # 取出当前最小和的组合
            val, i, j = heapq.heappop(heap)
            result.append([nums1[i], nums2[j]])
            
            # 将nums2的下一个元素加入堆(如果存在)
            if j + 1 < len(nums2):
                heapq.heappush(heap, (nums1[i] + nums2[j+1], i, j+1))
        
        return result

if __name__ == "__main__":
    # 测试用例
    test1 = Solution().kSmallestPairs([1,7,11], [2,4,6], 3)  # [[1,2],[1,4],[1,6]]
    test2 = Solution().kSmallestPairs([1,1,2], [1,2,3], 2)   # [[1,1],[1,1]]
相关推荐
Wenhao.2 小时前
LeetCode Hot100 腐烂的橘子
算法·leetcode·职场和发展
Rock_yzh3 小时前
LeetCode算法刷题——560. 和为 K 的子数组
数据结构·c++·学习·算法·leetcode·职场和发展·哈希算法
nju_spy3 小时前
力扣每日一题(11.10-11.29)0-1 和 k 整除系列
python·算法·leetcode·前缀和·单调栈·最大公约数·0-1背包
做怪小疯子5 小时前
LeetCode 热题 100——二叉树——翻转二叉树
算法·leetcode·职场和发展
做怪小疯子6 小时前
LeetCode 热题 100——二叉树——二叉树的最大深度
算法·leetcode·职场和发展
Maỿbe6 小时前
暴打力扣之优先级队列(堆)
算法·leetcode·职场和发展
Swift社区6 小时前
LeetCode 438 - 找到字符串中所有字母异位词
算法·leetcode·职场和发展
学学学无无止境6 小时前
力扣-位1的个数
leetcode
别学LeetCode6 小时前
#leetcode# 1
leetcode
sheeta19986 小时前
LeetCode 每日一题笔记 日期:2025.11.30 题目:1590.使数组和能被 P 整除
笔记·算法·leetcode