插入区间

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

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

示例说明请见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. 如何在pyqt中在实现无边框窗口的同时保留Windows窗口动画效果(一)

    无边框窗体的实现思路 在pyqt中只要 self.setWindowFlags(Qt.FramelessWindowHint) 就可以实现边框的去除,但是没了标题栏也意味着窗口大小无法改变.窗口无法拖 ...

  2. ABC209 E Shiritori

    考虑对这个问题进行转化: 显然我们只关注每个串前三个棋子和后三个棋子,并且根据题目的特性,我们可以将任意的三个字符看作点,将一个字符串看作连接两个点的边,这样我们得到了一张点数为 \(52 ^ 3\) ...

  3. IDEA学习系列之Module概念

    感谢原文作者:小manong 原文链接:https://www.jianshu.com/p/fcccc37fcb73 简单应用:IDEA Maven创建多个Module相互依赖 1.Module的概念 ...

  4. ORA-22922:nonexistent LOB value问题及listagg()函数

    1 现象及错误信息 在执行一次查询的过程,Oracle出现ORA-22922:nonexistent LOB value 的错误:根据提示,是在查询时没有找到lob对象: 2 问题分析 查看SQL,发 ...

  5. MySQL数据类型的最优选择

    MySQL数据类型的最优选择   慎重选择数据类型很重要.为啥哩?可以提高性能.原理如下:            ● 存储(内存.磁盘).从而节省I/O(检索相同数据情况下)      ● 计算.进而 ...

  6. java实现ajax excel导入

    1,jsp js controller FileUpload.fileUp ObjectExcelRead.readExcel

  7. linux增加用户组,并在用户组下添加指定用户

    groupadd mysql #1 useradd -g mysql[用户组] mysql[用户名] #2 useradd mysql[用户名] -g mysql[用户组]

  8. python——rsa加签名以及分段加密

    借鉴 https://www.cnblogs.com/sammy1989/p/9583965.html 最近请求一个系统,对方要求加密.折腾了一天,使用pycryptodome库,最终代码如下: #! ...

  9. matlab构建栅格地图绘图思路

    matlab构建栅格地图绘图思路 近来因研究需要,调研并思考了栅格地图的生成方法,暂时总结以备不时之需. 栅格的建立最需要注意栅格粒度的问题,即根据需要调整栅格的边长,目前有两种思路一种是固定栅格边长 ...

  10. postman常用测试脚本

    测试脚本: 设置环境变量 var jsonData = JSON.parse(responseBody); postman.setGlobalVariable("5KMST", j ...