返回
进击的算法:携手路飞,征服 LeetCode 373
前端
2023-09-17 00:55:45
让我们扬帆起航,踏上算法的征途,探寻 LeetCode 373 中的奥秘。在这片数字的海洋里,我们化身海贼王路飞,手握利剑,誓要找到那散落在数组中的最小 K 对数字。
题海中的航行
船长如是说:“给定两个以升序排列的整数数组 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 对数字。这次航行,不仅增强了我们的算法技能,更激发了我们对算法探索的热情。让我们继续扬帆起航,在算法的海洋中寻找更多的宝藏!