加载中...
632-最小区间(Smallest Range Covering Elements from K Lists)
发表于:2021-12-03 | 分类: 困难
字数统计: 431 | 阅读时长: 2分钟 | 阅读量:

原文链接: 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%

提交历史

提交时间 提交结果 执行时间 内存消耗 语言
上一篇:
630-课程表 III(Course Schedule III)
下一篇:
633-平方数之和(Sum of Square Numbers)
本文目录
本文目录