插入區間

原題

  Given a set of non-overlapping intervals, insert a new interval into the intervals (merge if necessary).
  You may assume that the intervals were initially sorted according to their start times.
  Example 1:
  Given intervals [1,3],[6,9], insert and merge [2,5] in as [1,5],[6,9].
  Example 2:
  Given [1,2],[3,5],[6,7],[8,10],[12,16], insert and merge [4,9] in as [1,2],[3,10],[12,16].
  This is because the new interval [4,9] overlaps with [3,5],[6,7],[8,10].java

題目大意

  給定一系列非覆蓋的區間,插入一個新的區間,有必要的時候進行區間合併,區間開始是以起始時間進行合併的算法

解題思路

  若是原來的區間比插入區間小就插入結果集,若是插入區間有重疊,更新插入區間,若是插入區間小於原來的區間,先插入插入區間,再添加大的區間app

代碼實現

算法實現類spa

import java.util.LinkedList;
import java.util.List;

public class Solution {

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

        // 保存結果的集合
        List<Interval> result = new LinkedList<>();

        // 輸入集非空
        if (intervals != null) {
            // 遍歷元素
            for (Interval item : intervals) {
                // newInterval == null 表示插入的區間已經處理完了
                // 將比插入區間小的區間加入結果集中
                if (newInterval == null || item.end < newInterval.start) {
                    result.add(item);
                }
                // 將比插入區間大的區間加入結果集中,同時將插入的區間加入結果集
                else if (item.start > newInterval.end) {
                    result.add(newInterval);
                    result.add(item);
                    newInterval = null;
                }
                // 插入區間有重疊,更新插入區間
                else {
                    newInterval.start = Math.min(newInterval.start, item.start);
                    newInterval.end = Math.max(newInterval.end, item.end);
                }
            }
        }

        // 若是插入區間非空說明插入區間還未被處理
        if (newInterval != null) {
            result.add(newInterval);
        }

        return result;
    }
}
相關文章
相關標籤/搜索