57. 插入区间

题目

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

示例 1:

输入:intervals = [[1,3],[6,9]], newInterval = [2,5]
输出:[[1,5],[6,9]]
示例 2:

输入:intervals = [[1,2],[3,5],[6,7],[8,10],[12,16]], newInterval = [4,8]
输出:[[1,2],[3,10],[12,16]]
解释:这是因为新的区间 [4,8] 与 [3,5],[6,7],[8,10] 重叠。
示例 3:

输入:intervals = [], newInterval = [5,7]
输出:[[5,7]]
示例 4:

输入:intervals = [[1,5]], newInterval = [2,3]
输出:[[1,5]]
示例 5:

输入:intervals = [[1,5]], newInterval = [2,7]
输出:[[1,7]]

提示:

0 <= intervals.length <= 104
intervals[i].length == 2
0 <= intervals[i][0] <= intervals[i][1] <= 105
intervals 根据 intervals[i][0] 按 升序 排列
newInterval.length == 2
0 <= newInterval[0] <= newInterval[1] <= 105

解决思路:
有两种情况,重叠或不重叠。
不重叠的情况是比较容易解决的。只需将新的间隔直接插入到相应的位置。

重叠的情况则较为复杂。有时会有多个重叠,并且需要更新新的间隔范围。以便包括所有重叠,然后将新的间隔添加到结果集,最后将后一个间隔添加到结果集。具体的想法是使用一个变量 curr 来遍历时间间隔。

如果当前 cur 间隔的结束位置小于要插入的间隔的开始位置,这意味着没有重叠,那么 cur 间隔被添加到结果 res 中,然后 cur 增加1。

直到 cur 出界或与 while 循环重叠,然后使用 while 循环处理所有重叠的间隔,每次使用两个间隔的起始位置的较小值和结束位置的较大值来更新插入 Interval,然后 cur 增加1。

While 循环退出,直到 cur 出界或没有重叠。然后将更新后的新间隔添加到结果 res 中,然后将 cur 后的间隔添加到结果中。

代码如下:

import java.util.ArrayList;
import java.util.List;

public class Insert_Interval {


	public class Solution_no_boolean_flag {

	    List<Interval> list = new ArrayList<Interval>();

	    public List<Interval> insert(List<Interval> intervals, Interval newInterval) {

	        if (intervals == null || newInterval == null) {
	            return list;
        	}
	        if (intervals.size() == 0) {
	            list.add(newInterval);
	            return list;
	        }

	        for (int i = 0; i < intervals.size(); i++) {

	            Interval current = intervals.get(i);

	            if (current.end < newInterval.start) {
	                list.add(current);
	            }

	            else if (newInterval.end < current.start) {
	                list.add(newInterval);
	                newInterval = current; //  update newInterval as the pending to be put in list
	            }

	            else /* overlap: if (current.end >= newInterval.start) */ {
	                Interval combine =
                        new Interval(
                            Math.min(current.start, newInterval.start),
                            Math.max(current.end, newInterval.end)
                        );
	                // list.add(combine);
	                newInterval = combine;
	            }
	        }
	        list.add(newInterval);
	        return list;
	    }
	}

}

57. 插入区间_第1张图片

你可能感兴趣的:(数据结构与算法,java,leetcode,数据结构,java)