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]]
相关推荐
wang__123001 小时前
力扣2094题解
算法·leetcode·职场和发展
小雅痞2 小时前
[Java][Leetcode middle] 55. 跳跃游戏
java·leetcode
元亓亓亓3 小时前
LeetCode热题100--206.反转链表--简单
算法·leetcode·链表
爱coding的橙子9 小时前
每日算法刷题 Day3 5.11:leetcode数组2道题,用时1h(有点慢)
算法·leetcode
Dream it possible!13 小时前
LeetCode 热题 100_只出现一次的数字(96_136_简单_C++)(哈希表;哈希集合;排序+遍历;位运算)
c++·leetcode·位运算·哈希表·哈希集合
MarkHard12318 小时前
Leetcode (力扣)做题记录 hot100(34,215,912,121)
算法·leetcode·职场和发展
Kidddddult19 小时前
力扣刷题Day 46:搜索二维矩阵 II(240)
算法·leetcode·力扣
是代码侠呀1 天前
从前端视角看网络协议的演进
leetcode·开源·github·github star·github 加星
刃神太酷啦1 天前
类和对象(1)--《Hello C++ Wrold!》(3)--(C/C++)
java·c语言·c++·git·算法·leetcode·github