Skip to content

Commit 24ad289

Browse files
committed
+ problem 373
1 parent 34ef072 commit 24ad289

File tree

5 files changed

+140
-0
lines changed

5 files changed

+140
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
# 373. Find K Pairs with Smallest Sums
2+
You are given two integer arrays `nums1` and `nums2` sorted in **non-decreasing order** and an integer `k`.
3+
4+
Define a pair `(u, v)` which consists of one element from the first array and one element from the second array.
5+
6+
Return *the* `k` *pairs* <code>(u<sub>1</sub>, v<sub>1</sub>), (u<sub>2</sub>, v<sub>2</sub>), ..., (u<sub>k</sub>, v<sub>k</sub>)</code> *with the smallest sums*.
7+
8+
#### Example 1:
9+
<pre>
10+
<strong>Input:</strong> nums1 = [1,7,11], nums2 = [2,4,6], k = 3
11+
<strong>Output:</strong> [[1,2],[1,4],[1,6]]
12+
<strong>Explanation:</strong> The first 3 pairs are returned from the sequence: [1,2],[1,4],[1,6],[7,2],[7,4],[11,2],[7,6],[11,4],[11,6]
13+
</pre>
14+
15+
#### Example 2:
16+
<pre>
17+
<strong>Input:</strong> nums1 = [1,1,2], nums2 = [1,2,3], k = 2
18+
<strong>Output:</strong> [[1,1],[1,1]]
19+
<strong>Explanation:</strong> The first 2 pairs are returned from the sequence: [1,1],[1,1],[1,2],[2,1],[1,2],[2,2],[1,3],[1,3],[2,3]
20+
</pre>
21+
22+
#### Constraints:
23+
* <code>1 <= nums1.length, nums2.length <= 10<sup>5</sup></code>
24+
* <code>-10<sup>9</sup> <= nums1[i], nums2[i] <= 10<sup>9</sup></code>
25+
* `nums1` and `nums2` both are sorted in **non-decreasing order**.
26+
* <code>1 <= k <= 10<sup>4</sup></code>
27+
* `k <= nums1.length * nums2.length`
28+
29+
## Solutions (Rust)
30+
31+
### 1. Solution
32+
```Rust
33+
use std::cmp::Reverse;
34+
use std::collections::BinaryHeap;
35+
36+
impl Solution {
37+
pub fn k_smallest_pairs(nums1: Vec<i32>, nums2: Vec<i32>, k: i32) -> Vec<Vec<i32>> {
38+
let mut heap = (0..nums1.len().min(k as usize))
39+
.map(|i| (Reverse(nums1[i] + nums2[0]), i, 0))
40+
.collect::<BinaryHeap<_>>();
41+
let mut ret = vec![];
42+
43+
for _ in 0..k {
44+
let (_, i, j) = heap.pop().unwrap();
45+
46+
if j + 1 < nums2.len() {
47+
heap.push((Reverse(nums1[i] + nums2[j + 1]), i, j + 1));
48+
}
49+
ret.push(vec![nums1[i], nums2[j]]);
50+
}
51+
52+
ret
53+
}
54+
}
55+
```
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
# 373. 查找和最小的 K 对数字
2+
给定两个以 **非递减顺序排列** 的整数数组 `nums1``nums2` , 以及一个整数 `k`
3+
4+
定义一对值 `(u,v)`,其中第一个元素来自 `nums1`,第二个元素来自 `nums2`
5+
6+
请找到和最小的 `k` 个数对 <code>(u<sub>1</sub>,v<sub>1</sub>)</code>, <code>(u<sub>2</sub>,v<sub>2</sub>)</code> ... <code>(u<sub>k</sub>,v<sub>k</sub>)</code> 。
7+
8+
#### 示例 1:
9+
<pre>
10+
<strong>输入:</strong> nums1 = [1,7,11], nums2 = [2,4,6], k = 3
11+
<strong>输出:</strong> [[1,2],[1,4],[1,6]]
12+
<strong>解释:</strong> 返回序列中的前 3 对数:
13+
[1,2],[1,4],[1,6],[7,2],[7,4],[11,2],[7,6],[11,4],[11,6]
14+
</pre>
15+
16+
#### 示例 2:
17+
<pre>
18+
<strong>输入:</strong> nums1 = [1,1,2], nums2 = [1,2,3], k = 2
19+
<strong>输出:</strong> [[1,1],[1,1]]
20+
<strong>解释:</strong> 返回序列中的前 2 对数:
21+
[1,1],[1,1],[1,2],[2,1],[1,2],[2,2],[1,3],[1,3],[2,3]
22+
</pre>
23+
24+
#### 提示:
25+
* <code>1 <= nums1.length, nums2.length <= 10<sup>5</sup></code>
26+
* <code>-10<sup>9</sup> <= nums1[i], nums2[i] <= 10<sup>9</sup></code>
27+
* `nums1``nums2` 均为 **升序排列**
28+
* <code>1 <= k <= 10<sup>4</sup></code>
29+
* `k <= nums1.length * nums2.length`
30+
31+
## 题解 (Rust)
32+
33+
### 1. 题解
34+
```Rust
35+
use std::cmp::Reverse;
36+
use std::collections::BinaryHeap;
37+
38+
impl Solution {
39+
pub fn k_smallest_pairs(nums1: Vec<i32>, nums2: Vec<i32>, k: i32) -> Vec<Vec<i32>> {
40+
let mut heap = (0..nums1.len().min(k as usize))
41+
.map(|i| (Reverse(nums1[i] + nums2[0]), i, 0))
42+
.collect::<BinaryHeap<_>>();
43+
let mut ret = vec![];
44+
45+
for _ in 0..k {
46+
let (_, i, j) = heap.pop().unwrap();
47+
48+
if j + 1 < nums2.len() {
49+
heap.push((Reverse(nums1[i] + nums2[j + 1]), i, j + 1));
50+
}
51+
ret.push(vec![nums1[i], nums2[j]]);
52+
}
53+
54+
ret
55+
}
56+
}
57+
```
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
use std::cmp::Reverse;
2+
use std::collections::BinaryHeap;
3+
4+
impl Solution {
5+
pub fn k_smallest_pairs(nums1: Vec<i32>, nums2: Vec<i32>, k: i32) -> Vec<Vec<i32>> {
6+
let mut heap = (0..nums1.len().min(k as usize))
7+
.map(|i| (Reverse(nums1[i] + nums2[0]), i, 0))
8+
.collect::<BinaryHeap<_>>();
9+
let mut ret = vec![];
10+
11+
for _ in 0..k {
12+
let (_, i, j) = heap.pop().unwrap();
13+
14+
if j + 1 < nums2.len() {
15+
heap.push((Reverse(nums1[i] + nums2[j + 1]), i, j + 1));
16+
}
17+
ret.push(vec![nums1[i], nums2[j]]);
18+
}
19+
20+
ret
21+
}
22+
}

README.md

+3
Original file line numberDiff line numberDiff line change
@@ -234,6 +234,7 @@
234234
[368][368l] |[Largest Divisible Subset][368] |![rs]
235235
[371][371l] |[Sum of Two Integers][371] |![rs]
236236
[372][372l] |[Super Pow][372] |![rs]
237+
[373][373l] |[Find K Pairs with Smallest Sums][373] |![rs]
237238
[374][374l] |[Guess Number Higher or Lower][374] |![py]
238239
[380][380l] |[Insert Delete GetRandom O(1)][380] |![rs]
239240
[382][382l] |[Linked List Random Node][382] |![py]
@@ -1657,6 +1658,7 @@
16571658
[368]:Problemset/0368-Largest%20Divisible%20Subset/README.md#368-largest-divisible-subset
16581659
[371]:Problemset/0371-Sum%20of%20Two%20Integers/README.md#371-sum-of-two-integers
16591660
[372]:Problemset/0372-Super%20Pow/README.md#372-super-pow
1661+
[373]:Problemset/0373-Find%20K%20Pairs%20with%20Smallest%20Sums/README.md#373-find-k-pairs-with-smallest-sums
16601662
[374]:Problemset/0374-Guess%20Number%20Higher%20or%20Lower/README.md#374-guess-number-higher-or-lower
16611663
[380]:Problemset/0380-Insert%20Delete%20GetRandom%20O\(1\)/README.md#380-insert-delete-getrandom-o1
16621664
[382]:Problemset/0382-Linked%20List%20Random%20Node/README.md#382-linked-list-random-node
@@ -3077,6 +3079,7 @@
30773079
[368l]:https://leetcode.com/problems/largest-divisible-subset/
30783080
[371l]:https://leetcode.com/problems/sum-of-two-integers/
30793081
[372l]:https://leetcode.com/problems/super-pow/
3082+
[373l]:https://leetcode.com/problems/find-k-pairs-with-smallest-sums/
30803083
[374l]:https://leetcode.com/problems/guess-number-higher-or-lower/
30813084
[380l]:https://leetcode.com/problems/insert-delete-getrandom-o1/
30823085
[382l]:https://leetcode.com/problems/linked-list-random-node/

README_CN.md

+3
Original file line numberDiff line numberDiff line change
@@ -234,6 +234,7 @@
234234
[368][368l] |[最大整除子集][368] |![rs]
235235
[371][371l] |[两整数之和][371] |![rs]
236236
[372][372l] |[超级次方][372] |![rs]
237+
[373][373l] |[查找和最小的 K 对数字][373] |![rs]
237238
[374][374l] |[猜数字大小][374] |![py]
238239
[380][380l] |[O(1) 时间插入、删除和获取随机元素][380] |![rs]
239240
[382][382l] |[链表随机节点][382] |![py]
@@ -1657,6 +1658,7 @@
16571658
[368]:Problemset/0368-Largest%20Divisible%20Subset/README_CN.md#368-最大整除子集
16581659
[371]:Problemset/0371-Sum%20of%20Two%20Integers/README_CN.md#371-两整数之和
16591660
[372]:Problemset/0372-Super%20Pow/README_CN.md#372-超级次方
1661+
[373]:Problemset/0373-Find%20K%20Pairs%20with%20Smallest%20Sums/README_CN.md#373-查找和最小的-k-对数字
16601662
[374]:Problemset/0374-Guess%20Number%20Higher%20or%20Lower/README_CN.md#374-猜数字大小
16611663
[380]:Problemset/0380-Insert%20Delete%20GetRandom%20O\(1\)/README_CN.md#380-o1-时间插入删除和获取随机元素
16621664
[382]:Problemset/0382-Linked%20List%20Random%20Node/README_CN.md#382-链表随机节点
@@ -3077,6 +3079,7 @@
30773079
[368l]:https://leetcode.cn/problems/largest-divisible-subset/
30783080
[371l]:https://leetcode.cn/problems/sum-of-two-integers/
30793081
[372l]:https://leetcode.cn/problems/super-pow/
3082+
[373l]:https://leetcode.cn/problems/find-k-pairs-with-smallest-sums/
30803083
[374l]:https://leetcode.cn/problems/guess-number-higher-or-lower/
30813084
[380l]:https://leetcode.cn/problems/insert-delete-getrandom-o1/
30823085
[382l]:https://leetcode.cn/problems/linked-list-random-node/

0 commit comments

Comments
 (0)