温哥华Microsoft面试算法题:Leetcode 373 & Python代码解法
大家好!最近在温哥华参加了微软的面试,其中一道算法题让我印象深刻,就是LeetCode 373: 查找和最小的 K 对数字。现在分享一下我的解题思路和Python代码,希望能帮到大家!
题目描述: 给定两个以升序排列的整数数组 nums1 和 nums2 , 以及整数 k 。定义一对数字 (u,v),其中第一个元素来自 nums1,第二个元素来自 nums2。找到和最小的 k 对数字 (u,v)。
示例:
输入: nums1 = , nums2 = , k = 3
输出: ,,]
解释: 1+2=3, 1+4=5, 1+6=7,这些是和最小的3对数字。
解题思路:
这道题可以用最小堆(Min-Heap)来高效解决。我们不需要遍历所有可能的组合,只需要维护一个大小为k的最小堆,存储当前找到的和最小的k对数字。
具体步骤如下:
- 创建一个最小堆,堆中的元素是 (sum, i, j),分别表示元素对的和、nums1中的索引和nums2中的索引。
- 将 (nums1 + nums2, 0, 0) 加入最小堆。
- 循环k次:
- 从最小堆中弹出最小元素 (sum, i, j)。
- 将结果 (nums1, nums2) 加入结果列表。
- 如果 j + 1 < nums2.length,则将 (nums1 + nums2, i, j+1) 加入最小堆。
- 如果 j == 0 并且 i + 1 < nums1.length,则将 (nums1 + nums2, i+1, j) 加入最小堆。 (避免重复加入)
Python代码:
import heapq
def kSmallestPairs(nums1, nums2, k):
heap = + nums2, 0, 0)]
result = []
visited = set()
visited.add((0,0))
while k > 0 and heap:
sum, i, j = heapq.heappop(heap)
result.append(, nums2])
k -= 1
if j + 1 < len(nums2) and (i, j+1) not in visited:
heapq.heappush(heap, (nums1 + nums2, i, j+1))
visited.add((i,j+1))
if i + 1 < len(nums1) and j == 0 and (i+1, j) not in visited:
heapq.heappush(heap, (nums1 + nums2, i+1, j))
visited.add((i+1,j))
return result
#Example usage
nums1 =
nums2 =
k = 3
print(kSmallestPairs(nums1, nums2, k)) # Output: , , ]
希望这个解答对大家有帮助! 如果大家有更好的解法或者疑问,欢迎在评论区留言讨论!