数据范围是3500,3500也就是说n的平方是可以接受的。这里告诉你就是有序的,也就是在提醒你可能会是一个类似于二分的算法,所以的话其实基于这两个认识的话我们就可以利用一个枚举叫二分的算法来解决这道题。怎么做呢?就首先的话我们要枚举一端,一端的话我们可以把所有的这个lists的里面所有元素都给去重然后对它进行左端的一个枚举,然后右端的话的呢我们就分别对每一个list进行一个二分来查找它可能包含所有至少来查找这个至少包含一个元素的最大的这么一个区间是什么。然后我们每次枚举的时候把这些最大的区间找一个最小的出来,这就是我们所需要的一个答案。那么这个整个复杂度的话应该是k的平方乘以一个log所有lists里面最大的一个,所有lists里面一个最长的元素n,所以应该是k^2*logn,这个复杂度是可以接受的。

首先呢是要对这个我们要对就要枚举的这个元素进行去重,这样我们就可以减少这个运算量。这里呢我用一种可能大家不怎么熟悉的一种去重的方法,就是用一个sort+unqiue这个方法来进行去重。然后unique的话呢是用于一个有序的数组的一个去重的方法。然后unique它返回的这个东西的下标,就最后一个元素的下标。然后注意的话这个unique的话,也就是对有序的、就是已经排好序的这么一个数组才能进行去重,不然的话它就有可能返回一个错误的结果。

这样我们就得到了它在已经去重之后的这个vi的区间是在哪儿,所以的话我们就可以来进行枚举了。枚举的话呢我们就直接就遍历到offset就行。offset是去重之后的vi的区间。注意一下这个unique去重之后是一个左闭右开的一个区间,就是STL的一个惯例。然后的话我们这个区间我们还得定义一下这个区间的话可能那个最大值就是是多少,我们最大值肯定是排完序之后的,左边的话它肯定是它的那个最小值,所以我们这边就直接用这个排好序之后的一个最小值以及排好序之后的最大值,就这里减1,因为是左闭右开。然后这里应该是枚举的话我们先把这个区间锁定在一个秩上面,最后我们来进行一个扩展,然后之后再跟大L、跟大R进行比较。然后我们有时候的话我们可能枚举的话可能是找不到一个合适的值,比如说我们如果是拿26去枚举的话,我们就肯定就,20、26作为它的那个左边那个值的话是肯定得不到一个正确的值的。比如说26到哪儿都,到30的话肯定是覆盖不了所有的区间的,所以的话那我们要定义一个布尔变量来判断一下我们是否是不是能找到这个值,所以的话我们就开始遍历所有的vector,然后的话,我们这里要用lower_bound,就是说找到第一个出现、第一次出现的地方,这样的话才是我们所需要的那个最小的区间。因为的话我们每次枚举的话肯定都是要找一个最大符合的,我们不是找最小符合的,就最小符合的话可能就其它区间就不会满足了,这样的话我们才有机会覆盖所有的,就我们以l这个值为枚举的话,我们才有可能找到这个r,l到r的话可以覆盖所有的这个区间。

class Solution {
public:vector<int> smallestRange(vector<vector<int>>& nums) {//sort+unique [1,1,1,2,3,3]->[1,2,3,XXXXXX]//vector<int> vi,rt;vector<int> vi;for (auto& i:nums) {for (auto j:i) {vi.push_back(j);        }}sort(vi.begin(), vi.end());//vector<int>::iterator offset= unique(vi.begin(),vi.end());int L = *vi.begin();//int R = *vi.end()-1;int R = *(vi.end() - 1);int offset = unique(vi.begin(), vi.end()) - vi.begin();for (int i = 0;i < offset;i++) {int l = vi[i];int r = vi[i];bool find = false;for (auto& j : nums) {auto iter = lower_bound(j.begin(),j.end(),l);if (iter != j.end()) {find = true;r = max(*iter,r);}else {find = false;break;}}if (find) {if ((r -l<R-L)||(l<L&&r-l==R-L)) {L = l;R = r;}}}//rt.push_back(vi[L]);//rt.push_back(vi[R]);//return rt;return { L,R };}
};

转载于:https://www.cnblogs.com/ZHONGZHENHUA/p/10781087.html

LeetCode Smallest Range相关推荐

  1. leetcode 304. Range Sum Query 2D - Immutable |304. 二维区域和检索 - 矩阵不可变(二维前缀和问题)

    题目 https://leetcode.com/problems/range-sum-query-2d-immutable/ 题解 本题是 medium 难度,二维前缀和问题.相似题目有: Easy: ...

  2. 【leetcode】910. Smallest Range II

    题目如下: 解题思路:我的思路是先找出最大值.对于数组中任意一个元素A[i]来说,如果A[i] + K 是B中的最大值,那么意味着从A[i+1]开始的元素都要减去K,即如果有A[i] + K > ...

  3. LeetCode 910. Smallest Range II

    很有意思的一道数学推理题目, 剪枝以后解法也很简洁. 初看貌似需要把每个数跟其他数作比较.但排序以后可以发现情况大大简化: 对于任一对元素a[i] < a[j], a[i] - k和a[j] + ...

  4. 数据结构线段树介绍与笔试算法题-LeetCode 307. Range Sum Query - Mutable--Java解法

    此文首发于我的个人博客:zhang0peter的个人博客 LeetCode题解文章分类:LeetCode题解文章集合 LeetCode 所有题目总结:LeetCode 所有题目总结 线段树(Segme ...

  5. 181.Smallest Range I

    题目 Given an array A of integers, for each integer A[i] we may choose any x with -K <= x <= K, ...

  6. [LeetCode] 303. Range Sum Query - Immutable

    https://leetcode.com/problems/range-sum-query-immutable/ 用一个 sum 数组,sum[i] -- nums 中选出前 i 个元素,求和所得到的 ...

  7. leetcode 303. Range Sum Query - Immutable | 303. 区域和检索 - 数组不可变(一维前缀和问题)

    题目 https://leetcode.com/problems/range-sum-query-immutable/ 题解 标准的前缀和问题,简单题,不多说,直接上代码 import java.ut ...

  8. Java实现 LeetCode 715 Range 模块(选范围)

    715. Range 模块 Range 模块是跟踪数字范围的模块.你的任务是以一种有效的方式设计和实现以下接口. addRange(int left, int right) 添加半开区间 [left, ...

  9. LeetCode 715. Range 模块

    715. Range 模块 [有序集合]用TreeMap来进行有序集合的合并和拆分 class RangeModule {// 区间拆分与合并 9:34 10:31TreeMap<Integer ...

最新文章

  1. linux回调函数的使用
  2. 声波配网:通过特定的声波序列将wifi密码发到无屏幕的设备上
  3. 《全栈性能Jmeter》-4JMeter脚本开发
  4. python stdout stderr 一起输出_Python在保留顺序的同时分别从子进程stdout和stderr读取...
  5. iphone11返回上一级手势怎么设置_苹果iphone12怎么关闭程序appp 怎么返回上一步
  6. js检测鼠标是否在操作_原生JS趣味demo:炫酷头像鼠标追随效果的实现
  7. python怎么用gamma函数_如何通俗的理解伽马(gamma)函数
  8. bash --config command not found 报错
  9. Flutter基础—根据用户输入改变控件
  10. vue 生成二维码:vue-qr插件
  11. javplayer 使用教程_「松下A6系列伺服使用手册」6.出现问题时
  12. 嵌入式测试 模拟共享单车
  13. [PHP]md5加密
  14. 银河麒麟系统开启root用户登录
  15. Arch Linux 安装 Anbox
  16. Python机器学习-搭建神经网络以及数据集引入和断点续存
  17. Android 精华 - 收藏全集 -
  18. 这可能是你近 2 年发论文最好机会!
  19. windows10、windows11无法连接到打印机,错误代码0x0000011b,不删 KB5005565更新的解决办法,亲测可行
  20. Henry前端笔记之 HTML相关

热门文章

  1. matlab中获取view,ios 怎么获取一个view的位置
  2. java js跳出循环_[Java教程]js循环的总结
  3. 【51单片机快速入门指南】6.3:DS18B20 单总线数字温度计的多路读取
  4. python基础-super
  5. ar 和 nm 用法
  6. uni.$emit和uni.$on用法;uni-app微信小程序页面通讯;微信小程序页面通讯
  7. TCPDUMP/LIBPCAP 3-PCAP's MAN手册(1)
  8. [Redux/Mobx] Redux怎样重置状态?
  9. javascript学习系列(18):数组中的include方法
  10. [css] 写出你知道的CSS水平和垂直居中的方法