632. 最小区间

难度困难235收藏分享切换为英文关注反馈

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

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

示例:

输入:[[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
  • -105 <= 元素的值 <= 105
  • 对于使用Java的用户,请注意传入类型已修改为List<List<Integer>>。重置代码模板后可以看到这项改动。

通过次数14,960提交次数25,456

这道题用二分,剪剪枝然后循环过一下就好了、

时间复杂度是O(k*n*log(k*n))

#include<stdio.h>
#include<stdio.h>
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
vector<int>::iterator getbinary(vector<int> &v,int n)
{int nleft = 0;int nright = v.size() - 1;int mid = (nleft + nright) / 2;while (nleft < nright){int Val = *(v.begin() + mid);if (Val >= n){nright = mid - 1;}else if (Val < n){nleft = mid + 1;}mid = (nleft + nright) / 2;}return v.begin() + nleft;
}
vector<int>::iterator getmaxmin(vector<int> &v, int n)
{if(*v.begin() == n)return v.begin();if (*v.begin() > n)return v.end();if (*(v.end() - 1) > n){vector<int>::iterator it = getbinary(v, n);if (*it > n)return it-1;else return it;}     return v.end()-1;
}
vector<int>::iterator getminmax(vector<int> &v, int n)
{if (*(v.end() - 1) < n)return v.end();if (*v.begin() >= n)return v.begin();vector<int>::iterator it = getbinary(v, n);if (*it >= n)return it;else return it + 1;}
vector<int> smallestRange(vector<vector<int>>& nums) {int nleft,nright = 0;int nLen = 200000;vector<int> nums_max;vector<int> v_ans;v_ans.clear();for (auto it = nums.begin(); it != nums.end(); it++){auto itit = it->begin();for (itit; itit != it->end(); itit++){nums_max.push_back(*itit);}}sort(nums_max.begin(), nums_max.end());int num = -100001;for (auto mit = nums_max.begin(); mit != nums_max.end(); mit++){nright = *mit;if (nright == num){continue;}else{num = nright;}int nflag = 0;int nmax = 100001;for (auto nit = nums.begin(); nit != nums.end(); nit++){vector<int>::iterator rit = getmaxmin(*nit, nright);if (rit != nit->end()){if (nmax > *rit)nmax = *rit;}if (rit == nit->end()){nflag = 1;break;}}if (nflag != 1){nleft = nmax;if (nright - nleft < nLen){v_ans.clear();v_ans.push_back(nleft);v_ans.push_back(nright);nLen = nright - nleft;}}nleft = *mit;nflag = 0;nmax = -100001;for (auto nit = nums.begin(); nit != nums.end(); nit++){vector<int>::iterator rit = getminmax(*nit, nright);if (rit != nit->end())if (nmax < *rit)nmax = *rit;if (rit == nit->end()){nflag = 1;break;}}if (nflag)continue;nright = nmax;if (nright - nleft < nLen){v_ans.clear();v_ans.push_back(nleft);v_ans.push_back(nright);nLen = nright - nleft;}}return v_ans;
}
int main()
{vector<vector<int>> nums;// = [[-89, 1, 69, 89, 90, 98], [-43, -36, -24, -14, 49, 61, 66, 69], [73, 94, 94, 96], [11, 13, 76, 79, 90], [-40, -20, 1, 9, 12, 12, 14], [-91, -31, 0, 21, 25, 26, 28, 29, 29, 30], [23, 88, 89], [31, 42, 42, 57], [-2, 6, 11, 12, 12, 13, 15], [-3, 25, 34, 36, 39], [-7, 3, 29, 29, 31, 32, 33], [4, 11, 14, 15, 15, 18, 19], [-34, 9, 12, 19, 19, 19, 19, 20], [-26, 4, 47, 53, 64, 64, 64, 64, 64, 65], [-51, -25, 36, 38, 50, 54], [17, 25, 38, 38, 38, 38, 40], [-30, 12, 15, 19, 19, 20, 22], [-14, -13, -10, 68, 69, 69, 72, 74, 75], [-39, 42, 70, 70, 70, 71, 72, 72, 73], [-67, -34, 6, 26, 28, 28, 28, 28, 29, 30, 31]];vector<int >v;/* v.push_back(4);v.push_back(10);v.push_back(15);v.push_back(24);v.push_back(26);nums.push_back(v);v.clear();v.push_back(0);v.push_back(9);v.push_back(12);v.push_back(20);nums.push_back(v);v.clear();v.push_back(5);v.push_back(18);v.push_back(22);v.push_back(30);nums.push_back(v);*//* v.push_back(-5);v.push_back(-4);v.push_back(-3);v.push_back(-2);v.push_back(-1);v.push_back(0);nums.push_back(v);v.clear();v.push_back(1);v.push_back(2);v.push_back(3);v.push_back(4);v.push_back(5);nums.push_back(v);v.clear();v.push_back(5);v.push_back(18);v.push_back(22);v.push_back(30);nums.push_back(v);*//*v.push_back(10);v.push_back(10);nums.push_back(v);v.clear();v.push_back(11);v.push_back(11);nums.push_back(v);*//* int a[13] = { 11,14,8,11,8,21,15,20,15,24,19,17,12};for (int i = 0; i < 13; i++){int n;for (int j = 0; j < a[i]; j++){scanf("%d", &n);v.push_back(n);}   nums.push_back(v);v.clear();}*/v.push_back(1);v.push_back(2);v.push_back(3);nums.push_back(v);v.clear();v.push_back(1);v.push_back(2);v.push_back(3);nums.push_back(v);v.clear();v.push_back(1);v.push_back(2);v.push_back(3);nums.push_back(v);vector<int> v_ans = smallestRange(nums);auto it = v_ans.begin();for (it; it != v_ans.end(); it++){cout << *it << endl;}return 0;
}

LeetCode632 最小区间相关推荐

  1. leetcode632. 最小区间(堆+多指针)

    你有 k 个升序排列的整数数组.找到一个最小区间,使得 k 个列表中的每个列表至少有一个数包含在其中. 我们定义如果 b-a < d-c 或者在 b-a == d-c 时 a < c,则区 ...

  2. 632. Smallest Range Covering Elements from K Lists 最小区间

    你有 k 个升序排列的整数数组.找到一个最小区间,使得 k 个列表中的每个列表至少有一个数包含在其中. 我们定义如果 b-a < d-c 或者在 b-a == d-c 时 a < c,则区 ...

  3. [Leetcode][第632题][JAVA][最小区间][堆][滑动窗口]

    [问题描述][困难] [解答思路] 1. 堆 复杂度 class Solution {public int[] smallestRange(List<List<Integer>> ...

  4. LeetCode 1851. 包含每个查询的最小区间(排序 + 离线查询 + 优先队列)

    文章目录 1. 题目 2. 解题 1. 题目 给你一个二维整数数组 intervals ,其中 intervals[i] = [lefti, righti] 表示第 i 个区间开始于 lefti .结 ...

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

    文章目录 1. 题目 2. 解题 1. 题目 你有 k 个升序排列的整数数组. 找到一个最小区间,使得 k 个列表中的每个列表至少有一个数包含在其中. 我们定义如果 b-a < d-c 或者在 ...

  6. 二维海浪波数谱的matlab,一种海杂波图像下基于最小区间思想的海浪主波周期反演方法...

    一种海杂波图像下基于最小区间思想的海浪主波周期反演方法 [专利摘要]本发明属于海杂波图像下海浪参数分析[技术领域],具体涉及一种海杂波图像下基于最小区间思想的海浪主波周期反演方法.本发明包括:基于雷达 ...

  7. UVA10020(最小区间覆盖)

    题意:       给你一个区间[0,m]和一些小的区间[l,r]让你选择最少的小区间个数去把整个区间覆盖起来. 思路:       算是比较经典的贪心题目吧(经典于难度没什么对应关系),大体思路可以 ...

  8. UVa 10020 (最小区间覆盖) Minimal coverage

    题意: 数轴上有n个闭区间[ai, bi],选择尽量少的区间覆盖一条指定线段[0, m] 算法: [start, end]为已经覆盖到的区间 这是一道贪心 把各个区间先按照左端点从小到大排序,更新st ...

  9. [NOI2016]区间-线段树

    一道很巧妙的题. 首先我们需要解决的问题,怎么快速判断选出的m个区间是否存在交. 我们反过来考虑这个问题, 我们每一个选出的区间,就对应的在线段树上区间加1,那么只要存在最大值等于m,就一定有m个区间 ...

最新文章

  1. Python实现俄罗斯方块
  2. Visual Studio 2013开发 mini-filter driver step by step (3) - 查看运行结果
  3. windows下的结束标志
  4. 微型计算机主机箱内所有部件均由,《计算机应用基础》模拟试题
  5. perl语言编程 第四版_被称作“胶水语言”的PERL,在芯片设计和验证中可以这样使用...
  6. 使用exp导出报错EXP-00091
  7. java与python结合使用_Java与Python使用grpc跨平台调用
  8. 电力安全工作规程发电厂和变电站电气部分_全国勘察设计注册电气工程师(发输变电)专业考试标准、规范目录...
  9. Charles最新版破解注册方法
  10. 2022 腾讯云 阿里云返佣政策对比
  11. fifo的rdata_异步FIFO设计与实现
  12. 从劳动分工的角度理解CPU、FPGA和ASIC
  13. mysql sumif函数的使用方法_MySQL与EXCEL sum sumif sumifs 函数结合_品牌汇总_20161101
  14. 诺顿杀毒软件设置日常设置及防火墙配置(图文)
  15. 庄懂的TA笔记(六)<FakeEnvReflect 生锈,锈迹效果>
  16. 【插件】Unity插件UnitySRDebugger的简单使用
  17. fatal: bad boolean config value ‘“false”‘ for ‘http.sslverify
  18. 聚类分析(cluster analysis)
  19. LT-mapper,LT-SLAM代码运行与学习
  20. Python 分数阶傅里叶变换

热门文章

  1. Pytorch:初始化
  2. Python基础----Matplotlib_新增
  3. Linux 下的 sleep
  4. python高级-------python2.7教程学习【廖雪峰版】(四)
  5. logstash 启动方式
  6. 一直接受键盘字符 接收小写字符出输出大写 接受大写输出小写 数字不输出
  7. 怎样改动、扩展并重写Magento代码
  8. PySide 简易教程二-------工欲善其事,必先利其器
  9. Lync Server 2013 安装准备工具 for Win 2008 R2
  10. 吴恩达机器学习week2