Insert Interval(插入区间)

http://www.lintcode.com/en/problem/insert-interval/

/**
 * 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 ArrayList insert(List intervals, Interval newInterval) {
        // write your code here
        //用一个变量来记录 newInterval 是否已经处理过了
        boolean hasInsert = false;
        for (int i = 0; i < intervals.size(); i++) {
            Interval interval = intervals.get(i);
            if (!hasInsert) {
                if (interval.end < newInterval.start) {
                    //新元素的起始大于末尾的时候,肯定不是适合的位置
                    continue;
                } else if (interval.start > newInterval.end) {
                    //新元素的结束小于元素的开始,表示它们没有交叉,又必须要插入了。后边也不会产生交集,直接结束。
                    hasInsert = true;
                    intervals.add(i, newInterval);
                    break;
                } else {
                    //如果不符合上边的两种情况,表示它们肯定有交集,因为不确定后边是否还有交集,所以只修改状态位,不结束循环。
                    hasInsert = true;
                    interval.start = Math.min(interval.start, newInterval.start);
                    interval.end = Math.max(interval.end, newInterval.end);
                }
            } else {
                Interval last = intervals.get(i - 1);
                if (last.end >= interval.start) {
                    //有交集,删除一个元素。
                    last.end = Math.max(last.end, interval.end);
                    intervals.remove(i);
                    i--;
                } else {
                    //没有交集,后边也不会有,直接退出。
                    break;
                }
            }
        }
        if (!hasInsert) {
            //一直没有添加,直接追加到尾部。
            intervals.add(newInterval);
        }
        return new ArrayList<>(intervals);
    }
};

你可能感兴趣的:(Insert Interval(插入区间))