原文链接: https://leetcode-cn.com/problems/smallest-range-covering-elements-from-k-lists
英文原文
You have k
lists of sorted integers in non-decreasing order. Find the smallest range that includes at least one number from each of the k
lists.
We define the range [a, b]
is smaller than range [c, d]
if b - a < d - c
or a < c
if b - a == d - c
.
Example 1:
Input: nums = [[4,10,15,24,26],[0,9,12,20],[5,18,22,30]] Output: [20,24] Explanation: List 1: [4, 10, 15, 24,26], 24 is in range [20,24]. List 2: [0, 9, 12, 20], 20 is in range [20,24]. List 3: [5, 18, 22, 30], 22 is in range [20,24].
Example 2:
Input: nums = [[1,2,3],[1,2,3],[1,2,3]] Output: [1,1]
Example 3:
Input: nums = [[10,10],[11,11]] Output: [10,11]
Example 4:
Input: nums = [[10],[11]] Output: [10,11]
Example 5:
Input: nums = [[1],[2],[3],[4],[5],[6],[7]] Output: [1,7]
Constraints:
nums.length == k
1 <= k <= 3500
1 <= nums[i].length <= 50
-105 <= nums[i][j] <= 105
nums[i]
is sorted in non-decreasing order.
中文题目
你有 k
个 非递减排列 的整数列表。找到一个 最小 区间,使得 k
个列表中的每个列表至少有一个数包含在其中。
我们定义如果 b-a < d-c
或者在 b-a == d-c
时 a < c
,则区间 [a,b]
比 [c,d]
小。
示例 1:
输入:nums = [[4,10,15,24,26], [0,9,12,20], [5,18,22,30]] 输出:[20,24] 解释: 列表 1:[4, 10, 15, 24, 26],24 在区间 [20,24] 中。 列表 2:[0, 9, 12, 20],20 在区间 [20,24] 中。 列表 3:[5, 18, 22, 30],22 在区间 [20,24] 中。
示例 2:
输入:nums = [[1,2,3],[1,2,3],[1,2,3]] 输出:[1,1]
示例 3:
输入:nums = [[10,10],[11,11]] 输出:[10,11]
示例 4:
输入:nums = [[10],[11]] 输出:[10,11]
示例 5:
输入:nums = [[1],[2],[3],[4],[5],[6],[7]] 输出:[1,7]
提示:
nums.length == k
1 <= k <= 3500
1 <= nums[i].length <= 50
-105 <= nums[i][j] <= 105
nums[i]
按非递减顺序排列
通过代码
高赞题解
解题思路:
首先将 $k$ 组数据升序合并成一组,并记录每个数字所属的组,例如:
$[[4,10,15,24,26], [0,9,12,20], [5,18,22,30]]$
合并升序后得到:
$[(0, 1), (4, 0), (5, 2), (9, 1), (10, 0), (12, 1), (15, 0), (18, 2), (20, 1), (22, 2), (24, 0), (26, 0), (30, 2)]$
然后只看所属组的话,那么
$[1, 0, 2, 1, 0, 1, 0, 2, 1, 2, 0, 0, 2]$
按组进行滑窗,保证一个窗口的组满足$k$组后在记录窗口的最小区间值。
[1 0 2] 2 1 0 1 0 2 1 2 0 0 2 [0, 5]
1 [0 2 1] 1 0 1 0 2 1 2 0 0 2 [0, 5]
1 0 [2 1 0] 0 1 0 2 1 2 0 0 2 [0, 5]
1 0 [2 1 0 1] 1 0 2 1 2 0 0 2 [0, 5]
1 0 [2 1 0 1 0] 0 2 1 2 0 0 2 [0, 5]
1 0 2 1 0 [1 0 2] 2 1 2 0 0 2 [0, 5]
1 0 2 1 0 1 [0 2 1] 1 2 0 0 2 [0, 5]
1 0 2 1 0 1 [0 2 1 2] 2 0 0 2 [0, 5]
1 0 2 1 0 1 0 2 [1 2 0] 0 0 2 [20, 24]
1 0 2 1 0 1 0 2 [1 2 0 0] 0 2 [20, 24]
1 0 2 1 0 1 0 2 [1 2 0 0 2] 2 [20, 24]
class Solution {
public:
vector<int> smallestRange(vector<vector<int>>& nums) {
vector<pair<int, int>> ordered; // (number, group)
for (size_t k = 0; k < nums.size(); ++k)
for (auto n: nums[k]) ordered.push_back({n, k});
sort(ordered.begin(), ordered.end());
int i = 0, k = 0;
vector<int> ans;
unordered_map<int, int> count;
for (size_t j = 0; j < ordered.size(); ++j) {
if (! count[ordered[j].second]++) ++k;
if (k == nums.size()) {
while (count[ordered[i].second] > 1) --count[ordered[i++].second]; // minialize range
if (ans.empty() || ans[1] - ans[0] > ordered[j].first - ordered[i].first) {
ans = vector<int>{ordered[i].first, ordered[j].first};
}
}
}
return ans;
}
};
统计信息
通过次数 | 提交次数 | AC比率 |
---|---|---|
19343 | 32303 | 59.9% |
提交历史
提交时间 | 提交结果 | 执行时间 | 内存消耗 | 语言 |
---|