[抄题]:
给出若干闭合区间,合并所有重叠的部分。
给出的区间列表 => 合并后的区间列表:
[ [
[1, 3], [1, 6],
[2, 6], => [8, 10],
[8, 10], [15, 18]
[15, 18] ]
]
[暴力解法]:
时间分析:
空间分析:
[思维问题]:
[一句话思路]:
区间类问题,先把起点排序才能具有逐个合并的能力和性质
[输入量]:空: 正常情况:特大:特小:程序里处理到的特殊情况:异常情况(不合法不合理的输入):
[画图]:
[一刷]:
- 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
[代码风格] :
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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线段树
[代码风格] :
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
/** * 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; } }