前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >LeetCode 632. 最小区间(排序+滑动窗口)

LeetCode 632. 最小区间(排序+滑动窗口)

作者头像
Michael阿明
发布2021-02-19 10:42:08
3750
发布2021-02-19 10:42:08
举报
文章被收录于专栏:Michael阿明学习之路

文章目录

1. 题目

你有 k 个升序排列的整数数组。 找到一个最小区间,使得 k 个列表中的每个列表至少有一个数包含在其中。

我们定义如果 b-a < d-c 或者在 b-a == d-c 时 a < c,则区间 [a,b] 比 [c,d] 小。

代码语言:javascript
复制
示例 1:
输入:[[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] 中。

注意:
给定的列表可能包含重复元素,所以在这里升序表示 >= 。
1 <= k <= 3500
-10^5 <= 元素的值 <= 10^5

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/smallest-range-covering-elements-from-k-lists 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2. 解题

  • 把数字和其区间的编号,存入vector,并排序
  • 滑动窗口方法,保证窗口内有 k 个区间的数,记录最小差的左右端点值
代码语言:javascript
复制
class Solution {
public:
    vector<int> smallestRange(vector<vector<int>>& nums) {
    	vector<vector<int>> v;
    	int k = nums.size();
    	for(int i = 0; i < nums.size(); ++i)
    	{
    		for(int n : nums[i])
    			v.push_back({n,i});//num, 区间编号
    	}
    	sort(v.begin(), v.end());
    	unordered_map<int,int> m;//区间编号,该区间有多少个数在窗口内
    	int i = 0, j = 0, n = v.size();
    	int l = -1e7, r = 1e7;
    	while(j < n)
    	{
    		if(m.size() < k)
    			m[v[j][1]]++;
    		while(m.size() == k)
    		{
    			if(v[j][0]-v[i][0] < r-l)
    			{
    				l = v[i][0];
    				r = v[j][0];
    			}
    			if(--m[v[i][1]] == 0)
    				m.erase(v[i][1]);
    			i++;
    		}
            j++;
    	}
    	return {l, r};
    }
};

496 ms 24.5 MB

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020/08/01 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • 1. 题目
  • 2. 解题
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档