返回

进击的算法:携手路飞,征服 LeetCode 373

前端

让我们扬帆起航,踏上算法的征途,探寻 LeetCode 373 中的奥秘。在这片数字的海洋里,我们化身海贼王路飞,手握利剑,誓要找到那散落在数组中的最小 K 对数字。

题海中的航行

题目地址 | B站地址

船长如是说:“给定两个以升序排列的整数数组 nums1 和 nums2,以及一个整数 k。定义一对值 (u,v),其中第一个元素来自 nums1,第二个元素来自 nums2。”

“你们的任务就是找到前 k 对值,使得 u + v 的和尽可能小。这些对可以按任意顺序返回。”

算法的武器库

身为一名算法海贼,我们需要熟练掌握各类武器。对于 LeetCode 373,我们选择双指针大法。

指针 i 和 j 分别指向 nums1 和 nums2 的头部。我们不断比较 nums1[i] + nums2[j] 的和,选择最小的和。移动较小值所在数组的指针,直到找到前 k 对数字。

航海日志

def kSmallestPairs(nums1, nums2, k):
    if not nums1 or not nums2 or k <= 0:
        return []
    
    pq = [(nums1[0] + nums2[0], 0, 0)]
    result = []

    while pq and len(result) < k:
        sum, i, j = heapq.heappop(pq)
        result.append([nums1[i], nums2[j]])
        if i < len(nums1) - 1:
            heapq.heappush(pq, (nums1[i+1] + nums2[j], i+1, j))
        if j < len(nums2) - 1 and i == 0:
            heapq.heappush(pq, (nums1[i] + nums2[j+1], i, j+1))
    
    return result

胜利的宝藏

经过一番激烈的角逐,我们成功找到前 k 对数字。这些数字,犹如海贼王罗杰留下的宝藏,见证了我们的智慧与坚持。

航海总结

LeetCode 373 是一道考验算法功底的题目。通过双指针的巧妙运用,我们可以高效地找到最小 K 对数字。这次航行,不仅增强了我们的算法技能,更激发了我们对算法探索的热情。让我们继续扬帆起航,在算法的海洋中寻找更多的宝藏!