[leetcode/lintcode 题解] Facebook 脸书面试题:插入区间
資深大佬 : zzzrf 0
题目描述可以看这里
算法:模拟
只要依次遍历,判断当前元素与要插入元素的关系。
-
如当前元素的右端点小于插入元素的左端点,则说明当前元素与插入元素无交并。
-
如当前元素的左端点大于插入元素的右端点,也说明当前元素与插入元素无交并。
依次遍历,判断当前元素与要插入元素的关系,找到插入点,插入这个新区间
- 若是相交的,那么就停止比较,把要插入元素和当前元素合并成新区间 因为合并后的新区间也许和右边的元素有交集,会引起连锁反应,所以一直和右边的元素合并,直到无法合并为止
复杂度分析
- 时间复杂度 O(n)
- n 为数组的大小
- 空间复杂度 O(n)
- n 为数组的大小
代码
/** * 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> newIntervals = new ArrayList<Interval>(); if(intervals.size() == 0){ newIntervals.add(newInterval); } for (int i = 0; i < intervals.size(); i++) { // 如果新区间的结束值小于区间开始值,插在这里,后面续上 if (newInterval.end < intervals.get(i).start) { newIntervals.add(newInterval); for (int j = i; j < intervals.size(); j++) { newIntervals.add(intervals.get(j)); } break; } // 如果新区间的开始值大于区间结束值,把当前区间加进去 else if (newInterval.start > intervals.get(i).end) { newIntervals.add(intervals.get(i)); } // 出现交叉,需要合并 else { newInterval.start = Math.min(newInterval.start, intervals.get(i).start); newInterval.end = Math.max(newInterval.end, intervals.get(i).end); } // 最后只剩一个数据了,添加进去 if(i == intervals.size() - 1){ newIntervals.add(newInterval); } } return newIntervals; } }
大佬有話說 (0)