插入区间

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

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

示例说明请见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. mongodb在插入数据环节避免数据重复的方法(爬虫中的使用update)

    mongo 去重 import pymongo client = pymongo.MongoClient() collection=client.t.test # collection.insert( ...

  2. plsql 普通游标

    -- ①普通游标:操作步骤 边敲边想 学无止境 /* 游标:指针:内存中的一块数据缓冲区,上下文: 将查询到的结果集缓存起来,便于进行逐行定位处理. 使用完成后要及时关闭: 操作步骤? 1.定义游标 ...

  3. ApacheCN Python 译文集(二)20211110 更新

    Python 应用计算思维 零.序言 第一部分:计算思维导论 一.计算机科学基础 二.计算思维要素 三.理解算法和算法思维 四.理解逻辑推理 五.探究性问题分析 六.设计解决方案和解决流程 七.识别解 ...

  4. switch多选择结构

    switch多选择结构 多选择结构还有一个实现方式就是switch case语句. switch case 语句判断一个变量与一个系列值中某个值是否相等,每个值称为一个分支. 语法: switch(e ...

  5. IntelliJ IDEA 学习笔记 - 修改编码

    感谢原文作者:codeke 原文链接:https://blog.csdn.net/cgl125167016/article/details/78666432 仓库:https://github.com ...

  6. SSH 密钥登录

    一.什么是SSH? 简单说,SSH是一种网络协议,用于计算机之间的加密登录. 如果一个用户从本地计算机,使用SSH协议登录另一台远程计算机,我们就可以认为,这种登录是安全的,即使被中途截获,密码也不会 ...

  7. winform 获得局域网内在线IP和计算机名,获取IP,多线程网络编程

    转载请注明来源:https://www.cnblogs.com/hookjc/ using System; using System.Collections.Generic; using System ...

  8. 消息队列 - mac上安装RabbitMq (转)

    什么是RabbitMQ? RabbitMQ是由Erlang语言编写的实现了高级消息队列协议(AMQP)的开源消息代理软件(也称为面向消息的中间件).支持WIndows.Linux.MAC OS 操作系 ...

  9. maven转web项目时 在Project Facets下转换时 Further configuration available没有出现

    如果下边的 further configuration available不出来 把Dynamic web module 去掉勾选,应用与项目,然后再点开项目的properties,再选中Dynami ...

  10. ValueStack与ContentMap (ActionContext.getContext().getValueStack().set())

    在方法 <action name="zilei" class="dtreeAction" method="zilei">   & ...