插入区间

题目描述:给你一个 无重叠的 ,按照区间起始端点排序的区间列表。

在列表中插入一个新的区间,你需要确保列表中的区间仍然有序且不重叠(如果有必要的话,可以合并区间)。

示例说明请见LeetCode官网。

来源:力扣(LeetCode)

链接:https://leetcode-cn.com/problems/insert-interval/

著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解法一:遍历数组
  • 首先如果intervals为空,因为不需要处理合并,所以直接返回一个区间newInterval;
  • 如果intervals不为空,声明1个变量length记录intervals的区间数,然后分以下几种情况进行处理:
    • 如果新区间newInterval的最大值小于intervals所有区间的最小值,则不需要合并,将新区间放在intervals的最前面,然后返回;
    • 如果新区间newInterval的最小值大于intervals所有区间的最大值,则不需要合并,将新区间放在intervals的最后面,然后返回;
    • 如果前面两种情况不存在,则用matchFirst和matchSecond记录newInterval的2个数,newLength为新区间的数量初始为length+1,用一个boolean数组flag记录intervals有哪些区间被合并,然后遍历intervals的所有区间:
      • curFirst和curSecond为当前区间的2个数,用matchFirst、matchSecond、curFirst、curSecond判断2个区间是否相交,如果相交,则更新matchFirst和matchSecond的值,并且将当前区间的标识更新为已合并。
    • 遍历完成后,初始化一个新的区间数组newIntervals,将新区间{matchFirst, matchSecond}和intervals放入newIntervals中没有被合并的区间放入newIntervals中(需要判断将新区间放在合适的位置),然后返回newIntervals。
public class LeetCode_057 {
public static int[][] insert(int[][] intervals, int[] newInterval) {
if (intervals == null || intervals.length == 0) {
return new int[][]{newInterval};
}
int length = intervals.length;
if (newInterval[1] < intervals[0][0]) {
// 如果新区间的最大值小于所有区间的最小值,则不需要合并,将新区间放在intervals的最前面
int[][] newIntervals = new int[length + 1][2];
newIntervals[0] = newInterval;
for (int i = 0; i < length; i++) {
newIntervals[i + 1] = intervals[i];
}
return newIntervals;
} else if (newInterval[0] > intervals[length - 1][1]) {
// 如果新区间的最小值大于所有区间的最大值,则不需要合并,将新区间放在intervals的最后面
int[][] newIntervals = new int[length + 1][2];
for (int i = 0; i < length; i++) {
newIntervals[i] = intervals[i];
}
newIntervals[length] = newInterval;
return newIntervals;
} else {
int matchFirst = newInterval[0], matchSecond = newInterval[1], newLength = length + 1;
boolean[] flag = new boolean[length];
for (int i = 0; i < length; i++) {
int curFirst = intervals[i][0], curSecond = intervals[i][1];
if (((matchFirst >= curFirst && matchFirst <= curSecond) || (matchSecond >= curFirst && matchSecond <= curSecond)) ||
((curFirst >= matchFirst && curFirst <= matchSecond) || (curSecond >= matchFirst && curSecond <= matchSecond))) {
// 有交集
matchFirst = Math.min(matchFirst, curFirst);
matchSecond = Math.max(matchSecond, curSecond);
flag[i] = true;
newLength--;
}
}
int[][] newIntervals = new int[newLength][2];
boolean added = false;
int pos = 0;
for (int i = 0; i < length; i++) {
if (!flag[i]) {
if (added) {
newIntervals[pos++] = intervals[i];
} else {
if (matchSecond < intervals[i][0]) {
newIntervals[pos++] = new int[]{matchFirst, matchSecond};
added = true;
}
newIntervals[pos++] = intervals[i];
}
}
}
if (!added) {
newIntervals[pos++] = new int[]{matchFirst, matchSecond};
} return newIntervals;
}
} public static void main(String[] args) {
int[][] intervals = new int[][]{{1, 2}, {3, 5}, {6, 7}, {8, 10}, {12, 16}};
int[] newInterval = new int[]{4, 8};
for (int[] ints : insert(intervals, newInterval)) {
for (int anInt : ints) {
System.out.print(anInt + " ");
}
System.out.println();
}
}
}

【每日寄语】 今天也是值得你用可爱和温柔去对待的一天呀。

LeetCode-057-插入区间的更多相关文章

  1. LeetCode 57 插入区间

    题目: 给出一个无重叠的 ,按照区间起始端点排序的区间列表. 在列表中插入一个新的区间,你需要确保列表中的区间仍然有序且不重叠(如果有必要的话,可以合并区间). 示例 1: 输入: intervals ...

  2. Java实现 LeetCode 57 插入区间

    57. 插入区间 给出一个无重叠的 ,按照区间起始端点排序的区间列表. 在列表中插入一个新的区间,你需要确保列表中的区间仍然有序且不重叠(如果有必要的话,可以合并区间). 示例 1: 输入: inte ...

  3. leetcode Insert Interval 区间插入

    作者:jostree  转载请注明出处 http://www.cnblogs.com/jostree/p/4051169.html 题目链接:leetcode Insert Interval 使用模拟 ...

  4. 【BZOJ】3065: 带插入区间K小值

    http://www.lydsy.com/JudgeOnline/problem.php?id=3065 题意:带插入.修改的区间k小值在线查询.(原序列n<=35000, 询问<=175 ...

  5. lintcode:插入区间

    题目: 插入区间 给出一个无重叠的按照区间起始端点排序的区间列表. 在列表中插入一个新的区间,你要确保列表中的区间仍然有序且不重叠(如果有必要的话,可以合并区间). 样例 插入区间[2, 5] 到 [ ...

  6. bzoj 3065: 带插入区间K小值 替罪羊树 && AC300

    3065: 带插入区间K小值 Time Limit: 60 Sec  Memory Limit: 512 MBSubmit: 1062  Solved: 253[Submit][Status] Des ...

  7. 合并区间 · Merge Intervals & 插入区间 · Insert Interval

    [抄题]: 给出若干闭合区间,合并所有重叠的部分. 给出的区间列表 => 合并后的区间列表: [ [ [1, 3], [1, 6], [2, 6], => [8, 10], [8, 10] ...

  8. [BZOJ3065]带插入区间K小值 解题报告 替罪羊树+值域线段树

    刚了一天的题终于切掉了,数据结构题的代码真**难调,这是我做过的第一道树套树题,做完后感觉对树套树都有阴影了......下面写一下做题记录. Portal Gun:[BZOJ3065]带插入区间k小值 ...

  9. 【题解】BZOJ 3065: 带插入区间K小值——替罪羊树套线段树

    题目传送门 题解 orz vfk的题解 3065: 带插入区间K小值 系列题解 一 二 三 四 惨 一开始用了一种空间常数很大的方法,每次重构的时候merge两颗线段树,然后无限RE(其实是MLE). ...

  10. LeetCode:汇总区间【228】

    LeetCode:汇总区间[228] 题目描述 给定一个无重复元素的有序整数数组,返回数组区间范围的汇总. 示例 1: 输入: [0,1,2,4,5,7] 输出: ["0->2&quo ...

随机推荐

  1. 关于Linux安装中NAT模式和桥接模式的区别详解(转载)

    1.一般我们在创建一个Linux虚拟机时候,会面临三个网络配置选择: 桥接模式.nat模式.host-only模式(主机模式,这个模式用得少,就不介绍了) 2.NAT模式: 所谓nat模式,就是虚拟系 ...

  2. Nginx日志管理

    1 日志管理 1.1 Nginx日志描述 通过访问日志,你可以得到用户地域来源.跳转来源.使用终端.某个URL访问量等相关信息:通过错误日志,你可以得到系统某个服务或server的性能瓶颈等.因此,将 ...

  3. Linux配置 ftp 和 ftp简单介绍

    一.ftp概念? /* ftp是一个协议和http协议都是叫协议 tcp和udp也是协议 ftp是文件(以流的形式进行传输)传输协议(针对于文件进行上传和下载) */ 1.如果ftp服务器有多台,服务 ...

  4. 如何在pyqt中实现亚克力磨砂效果的QLabel

    前言 Windows10 在 UWP 应用中支持亚克力画刷,可以在部件的底部绘制亚克力效果的背景图.下面我们使用 QLabel 来模拟这个磨砂过程. 实现方法 MSDN 文档中介绍了亚克力材料的配方, ...

  5. js 二分查找法之每日一更

    <!DOCTYPE html> <html> <head> <meta http-equiv="content-type" content ...

  6. Linux中Swap与Memory内存简单介绍 (转)

    https://blog.csdn.net/zwan0518/article/details/12059213 一.背景介绍 对于Linux来说,其在服务器市场的使用已经占据了绝对的霸主地位,不可动摇 ...

  7. Git远程仓库地址操作

    添加 git remote add test1_origin git@github.com:b84955189/test1.git test1_origin:远程地址名,这里是我自定的. git@gi ...

  8. HTML页元素自适应+居中总结(不定期补充)

    感谢大佬:https://www.cnblogs.com/SallyShan/p/11480685.html 图片自适应 背景图片自适应 /*背景页*/ #page_content{ width: 1 ...

  9. MySQL 数据库的tab 补全功能 (懒人必备)

    MySQL 数据库的tab补全功能                      跟着步骤走~~ 懒人养成第一步 不仅帮你补全 甚至预判你的预判,就问你可怕不可怕 1.安装相关依赖软件(需要配置yum官方 ...

  10. pytest(4)-测试用例执行顺序

    前言 上一篇文章我们讲了在pytest中测试用例的命名规则,那么在pytest中又是以怎样的顺序执行测试用例的呢? 在unittest框架中,默认按照ACSII码的顺序加载测试用例并执行,顺序为:09 ...