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

[抄题]:

给出若干闭合区间,合并所有重叠的部分。

给出的区间列表 => 合并后的区间列表:

[                     [
[1, 3], [1, 6],
[2, 6], => [8, 10],
[8, 10], [15, 18]
[15, 18] ]
]

[暴力解法]:

时间分析:

空间分析:

[思维问题]:

[一句话思路]:

区间类问题,先把起点排序才能具有逐个合并的能力和性质

[输入量]:空: 正常情况:特大:特小:程序里处理到的特殊情况:异常情况(不合法不合理的输入):

[画图]:

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

[一刷]:

  1. lambda表达式是调用了Comparator对象的.comparing方法进行的

[二刷]:

[三刷]:

[四刷]:

[五刷]:

[五分钟肉眼debug的结果]:

[总结]:

[复杂度]:Time complexity: O(n) Space complexity: O(n)

[英文数据结构或算法,为什么不用别的数据结构或算法]:

List<Interval> ans = new LinkedList<Interval>(); 原来还有interval型的数据,只要实现了list能往后添加就行

[其他解法]:

[Follow Up]:

[LC给出的题目变变变]:

495. Teemo Attacking

[代码风格] :

public class Solution {
/*
* @param intervals: interval list.
* @return: A new interval list.
*/
public List<Interval> merge(List<Interval> intervals) {
List<Interval> ans = new LinkedList<Interval>();
//sort
intervals.sort(Comparator.comparing(i -> i.start));//
//merge
Interval last = null;
for (Interval item : intervals) {
if (last == null || last.end < item.start) {
ans.add(item);
last = item;
}else {
last.end = Math.max(last.end, item.end);
}
}
return ans;
}
}

[抄题]:

给出一个无重叠的按照区间起始端点排序的区间列表。

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

插入区间[2, 5] 到 [[1,2], [5,9]],我们得到 [[1,9]]

插入区间[3, 4] 到 [[1,2], [5,9]],我们得到 [[1,2], [3,4], [5,9]]

[暴力解法]:

一个个比较

时间分析:

空间分析:

[思维问题]:

先插入,再merge。followup能直接套就直接套,尽量减少改动。属于换一个描述,本质不变。

[一句话思路]:

先插入,再merge。

[输入量]:空: 正常情况:特大:特小:程序里处理到的特殊情况:异常情况(不合法不合理的输入):

[画图]:

[一刷]:

[二刷]:

[三刷]:

[四刷]:

[五刷]:

[五分钟肉眼debug的结果]:

[总结]:

循环的对象是item,所以也对item进行插入

[复杂度]:Time complexity: O(n) Space complexity: O(n)

[英文数据结构或算法,为什么不用别的数据结构或算法]:

[其他解法]:

[Follow Up]:

[LC给出的题目变变变]:

715. Range Module线段树

[代码风格] :

/**
* Definition of Interval:
* public classs Interval {
* int start, end;
* Interval(int start, int end) {
* this.start = start;
* this.end = end;
* }
*/ public class Solution {
/*
* @param intervals: Sorted interval list.
* @param newInterval: new interval.
* @return: A new interval list.
*/
public List<Interval> insert(List<Interval> intervals, Interval newInterval) {
List<Interval> ans = new LinkedList<>(); //insert
int ind = 0;
while (ind < intervals.size() && intervals.get(ind).start < newInterval.start) {
ind++;
}
intervals.add(ind, newInterval);
//merge
Interval last = null;
for (Interval item : intervals) {
if (last == null || last.end < item.start) {
ans.add(item);//
last = item;
}else {
last.end = Math.max(last.end, item.end);
}
} return ans;
}
}
上一篇:HTML5 Canvas绘制转盘抽奖


下一篇:root与普通用户的切换