Interval是一类型的题目,面试的很喜欢出,这里把所有interval的题目全部总结一下;

Merge Intervals 首先按照start sort之后,判断end是否跟start相交,如果相交,end就是两者最大值;否则加入cur;注意最后需要加入cur;

class Solution {    public int[][] merge(int[][] intervals) {if(intervals == null || intervals.length == 0) {return new int[0][0];}// sort based on start;Arrays.sort(intervals, (a, b) -> (a[0] - b[0]));List<int[]> list = new ArrayList<int[]>();int[] last = new int[]{intervals[0][0], intervals[0][1]};for(int i = 1; i < intervals.length; i++) {int[] cur = new int[]{intervals[i][0], intervals[i][1]};if(last[1] < cur[0]) {list.add(last);last = cur;} else {last[1] = Math.max(last[1], cur[1]);}} list.add(last); // 注意最后需要加入last;int[][] result = new int[list.size()][2];int index = 0;for(int[] interval: list) {result[index][0] = interval[0];result[index][1] = interval[1];index++;}return result;}
}

Insert Interval 思路:分三种情况,一种是interval 在newInterval前面, 一种是newInterval在interval前面,一种是相交;

class Solution {public int[][] insert(int[][] intervals, int[] newInterval) {if(intervals == null || intervals.length == 0) {int[][] res = new int[1][2];res[0][0] = newInterval[0];res[0][1] = newInterval[1];return res;}List<int[]> list = new ArrayList<int[]>();for(int[] interval: intervals) {if(interval[1] < newInterval[0]) {// interval, newInterval;list.add(interval);} else if(newInterval[1] < interval[0]) {// newInterval, interval;list.add(newInterval);// 不要忘记newInterval往后挪动;newInterval = interval;} else {newInterval[0] = Math.min(newInterval[0], interval[0]);newInterval[1] = Math.max(newInterval[1], interval[1]);}}// 不要忘记加newInterval;list.add(newInterval);int[][] res = new int[list.size()][2];for(int i = 0; i < list.size(); i++) {int[] temp = list.get(i);res[i][0] = temp[0];res[i][1] = temp[1];}return res;}
}

Interval List Intersections 跟Time Intersection一样,因为是有序的,可以直接打擂台的方式,扫描,start取最大值,end取最小值,如果start <= end就加入 res。否则,淘汰掉end在前面的那个interval;

class Solution {public int[][] intervalIntersection(int[][] A, int[][] B) {List<int[]> list = new ArrayList<int[]>();int a = 0; int b = 0;while(a < A.length && b < B.length) {// { A[a][0], A[a][1] };// { B[b][0], B[b][1] };int start = Math.max(A[a][0], B[b][0]);int end = Math.min(A[a][1], B[b][1]);if(start <= end) {list.add(new int[] {start, end});} // 无论相交不相交,都要从a, b中间踢走一个;// start >= end;if(A[a][1] > B[b][1]) {b++;} else {a++;}}int[][] res = new int[list.size()][2];int index = 0;for(int[] item: list) {res[index][0] = item[0];res[index][1] = item[1];index++;}return res;}
}

Remove Interval 就是分情况讨论,cur在delete的哪个部位,相应做处理;非常适合电面,这题;

class Solution {public List<List<Integer>> removeInterval(int[][] intervals, int[] toBeRemoved) {List<List<Integer>> lists = new ArrayList<List<Integer>>();if(intervals == null || intervals.length == 0) {return lists;}int removeStart = toBeRemoved[0];int removeEnd = toBeRemoved[1];for(int[] interval : intervals) {int start = interval[0];int end = interval[1];// no overlap;if(end <= removeStart || removeEnd <= start) {lists.add(Arrays.asList(start, end));}   // 前面overlapif(start < removeStart && removeStart < end) {lists.add(Arrays.asList(start, removeStart));}// 完全在delete中间;if(removeStart < start && end < removeEnd) {continue;}// 后面overlap;if(start < removeEnd && removeEnd < end) {lists.add(Arrays.asList(removeEnd, end));}}return lists;}
}

Remove Covered Intervals 核心思想就是:算overlap了多少个,然后用总个数减去overlap的个数。如何计算overlap就是:sort array , 首先按照x sort,如果x相同,y按照从大到小sort,这样只有前面的能够cover后面的,后面的不能cover前面的,因为x都排序了,y是按照从大到小排序的。

class Solution {public int removeCoveredIntervals(int[][] intervals) {if(intervals == null || intervals.length == 0) {return 0;}int[] last = null;Arrays.sort(intervals, (a, b) -> (a[0] != b[0] ? a[0] - b[0] : b[1] - a[1]));int count = 0;for(int[] interval : intervals) {if(last == null) {last = interval;} else {if(last[1] >= interval[1]) {count++;} else {last = interval;}}}return intervals.length - count;}
}

Non-overlapping Intervals 按照start,排序,判断是否有重复也就是end是否大于后面的start,如果大于,就有重复,重复的话,要去掉的就是end最大的那个,也就是保留下end比较小的,这样去掉end最大的,也就是保证了remove最少的;

class Solution {public int eraseOverlapIntervals(int[][] intervals) {if(intervals == null || intervals.length == 0) {return 0;}Arrays.sort(intervals, (a, b) -> (a[0] != b[0] ? a[0] - b[0] : b[1] - a[1]));int[] cur = null;int count = 0;for(int[] interval : intervals) {if(cur == null) {cur = interval;} else {if(cur[1] > interval[0]) {count++;cur[1] = Math.min(cur[1], interval[1]);} else {// cur[1] <= interval[0];cur = interval;}}}return count;}
}

Find Right Interval 思路:题目要求很明显就是找第一个比自己大的start >= 我当前的end。所以找第一个比自己大,这个东西很好用treemap, 每次查找是logn, ceilingKey来找第一个比自己大的interval start,treemap里面存start和index;

class Solution {public int[] findRightInterval(int[][] intervals) {if(intervals == null || intervals.length == 0) {return new int[0];}int n = intervals.length;TreeMap<Integer, Integer> treemap = new TreeMap<>();for(int i = 0; i < n; i++) {treemap.put(intervals[i][0], i);}int[] res = new int[n];for(int i = 0; i < n; i++) {Integer ceilingKey = treemap.ceilingKey(intervals[i][1]);if(ceilingKey == null) {res[i] = -1;} else {res[i] = treemap.get(ceilingKey);}}return res;}
}

Interval 类型总结相关推荐

  1. ORACLE中的INTERVAL类型

    ORACLE中的INTERVAL类型 INTERVAL数据类型用来存储两个时间戳之间的时间间隔.可以指定years and months,或者days,hours,minuts,seconds之间的间 ...

  2. extract()函数:用于从一个date或者interval类型中截取到特定的部分

    extract()函数:用于从一个date或者interval类型中截取到特定的部分 ### extract 语法 extract ( { year | month | day | hour | mi ...

  3. Oracle:管理 date类型 interval 动态变化的分区:查询、删除

    -- 创建临时表,目的是获取long类型的:high_value 的值 drop table syscom_tab_partition_temp purge ;create table prm8_us ...

  4. 【SQL开发实战技巧】系列(十八):数据仓库中时间类型操作(进阶)INTERVAL、EXTRACT以及如何确定一年是否为闰年及周的计算

    系列文章目录 [SQL开发实战技巧]系列(一):关于SQL不得不说的那些事 [SQL开发实战技巧]系列(二):简单单表查询 [SQL开发实战技巧]系列(三):SQL排序的那些事 [SQL开发实战技巧] ...

  5. 分区表(表分区的具体作用、什么时候需要分区、表分区的优点)、表分区的几种类型及操作方法(range/hash/list/虚拟列/Interval/组合分区)、普通表转分区表的方法、分区表的其它操作

    文章目录 分区表(谨慎使用,了解即可) 表空间及分区表的概念 表分区的具体作用 什么时候需要分区 表分区的优点 表分区的几种类型及操作方法 范围分区(range) 哈希分区(hash) 列表分区(li ...

  6. oracle时间类型转化成java对象_Oracle数据库date类型与Java中Date的联系与转化

    以下是对Java中的日期对象与Oracle中的日期之间的区别与联系做点说明,以期对大家有所帮助. new Date():分配 Date 对象并初始化此对象,以表示分配它的时间(精确到毫秒),就是系统当 ...

  7. 将TIMESTAMP类型的差值转化为秒的方法

    两个TIMESTAMP之差得到的是INTERVAL类型,而有时我们只需要得到两个时间相差的秒数,如果变成INTERVAL之后,想要获取这个值会非常麻烦. 比较常见的方法是使用EXTRACT来抽取获得的 ...

  8. date类型_Chapter 01. 常见数据类型概述 Overview of Common Data Types

    课程:DataCamp_Skill Track_SQL fundamentals[笔记] Chapter 01. 常见数据类型概述 Overview of Common Data Types 了解常见 ...

  9. oracle extract类型,Oracle中extract()函数

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 在学习Oracle数据库的过程中,难免会有一些截取年月日或者获取两个日期之间的具体时间间隔或者获取interval类型特定部分的相关问题,那么下面的ext ...

  10. pgsql处理文档类型数据_pgsql_pg的数据类型

    PostgreSQL提供了丰富的数据类型.用户可以使用CREATE TYPE命令在数据库中创建新的数据类型.PostgreSQL的数据类型被分为四种,分别是基本数据类型.复合数据类型.域和伪类型. 基 ...

最新文章

  1. Android之SharedPreferences 讲解
  2. zentao这php,ZenTaoPHP后面计划
  3. 图解RadASM使用初步
  4. C#中Split用法 转
  5. MySQL工作中的实际用_数据库在工作中的应用,以及什么是MySQL?
  6. python条件控制语句_Python课堂笔记 条件控制语句
  7. 计算机基础知识教案1,计算机基础知识教案一
  8. 数论 —— 斐波那契数列(Fibonacci)
  9. 文档流、脱离文档流分析
  10. pom文件中配置repositories
  11. 微信小程序开发页面跳转教程
  12. Photoshop:如何使图片覆盖在文字上以及一种海报效果实现
  13. linux下玩三国志游戏,三国志威力无双手游官网版
  14. 利用网络劫持解决微信远程域名真机调试Api问题
  15. IDEA 开发工具安装教程及破解步骤(激活至2099年)
  16. 信誉管理软件的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  17. Injected and Delivered: Fabricating Implicit Control over Actuation Systems by Spoofing Inertial Sen
  18. 现代软件产品团队关键角色及职责简述
  19. kibana远端访问配置
  20. 全国马术场地障碍锦标赛

热门文章

  1. 1013. Battle Over Cities (25)
  2. Andorid通话自动录音
  3. 【Cactus仙人掌图】仙人掌基础知识学习笔记
  4. 断舍离------活成自己喜欢的样子
  5. matlab cftool光滑曲线导出为什么就不光滑了_博学 MATLAB如何导出精美的论文插图...
  6. Windows窗口(DirectX3D11学习笔记)
  7. uboot中展示gpio接口的驱动
  8. 微信小程序实现服务通知 模板消息详解(附源码)
  9. 搭建hexo博客与yilia主题优化
  10. E4A安卓app制作——初识易安卓(一)