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

题目描述

373. 查找和最小的 K 对数字

image-20250417152727785

思路分析

最小堆

参考代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
type Pair struct {
	sum, i, j int
}

type MinHeap []Pair

func (h MinHeap) Len() int           { return len(h) }
func (h MinHeap) Less(i, j int) bool { return h[i].sum < h[j].sum }
func (h MinHeap) Swap(i, j int)      { h[i], h[j] = h[j], h[i] }

func (h *MinHeap) Push(x interface{}) {
	*h = append(*h, x.(Pair))
}

func (h *MinHeap) Pop() interface{} {
	old := *h
	n := len(old)
	x := old[n-1]
	*h = old[0 : n-1]
	return x
}

func kSmallestPairs(nums1 []int, nums2 []int, k int) [][]int {
	h := &MinHeap{}
	heap.Init(h)
	res := [][]int{}

	// 初始化堆
	for i := 0; i < len(nums1) && i < k; i++ {
		heap.Push(h, Pair{nums1[i] + nums2[0], i, 0})
	}

	// 取出最小的 k 个数对
	for k > 0 && h.Len() > 0 {
		pair := heap.Pop(h).(Pair)
		i, j := pair.i, pair.j
		res = append(res, []int{nums1[i], nums2[j]})
		k--
		if j+1 < len(nums2) {
			heap.Push(h, Pair{nums1[i] + nums2[j+1], i, j + 1})
		}
	}

	return res
}
1
write your code here

➡️ 点击查看 Java 题解

1
write your code here
本文作者:
本文链接: https://hgnulb.github.io/blog/2024/54475263
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处!