Insert Interval
題意:
Given a non-overlapping interval list which is sorted by start point.
Insert a new interval into it, make sure the list is still in order and non-overlapping (merge intervals if necessary).
Example
Insert [2, 5]
into [[1,2], [5,9]]
, we get [[1,9]]
.
Insert [3, 4]
into [[1,2], [5,9]]
, we get [[1,2], [3,4], [5,9]]
.
解題思路:
遍歷每個原本陣列中的所有區間,不斷與新的區間作比較,分成以下三種情況作處理
- 當前區間在新區間前面,且兩者不重疊,則直接把當前區間放入結果。
- 當前區間在新區間後面,且兩者不重疊,則把新區間放入結果並更新新區間為舊區間。
- 當兩者重疊,則分別找出兩個區間的最小值與最大值,並建立新的區間,以合併兩個區間。
- 在此只是先把 newInterval 更新並末加入 list 中,待下一次再檢查
因很有可能newInterval 比 intervals 的最後一個還大,或是第三個狀況更新了 newInterval 而還沒加入,記得在最後把 newInterval 加入到 list中。
程式碼如下:
public ArrayList<Interval> insert(ArrayList<Interval> intervals, Interval newInterval) {
ArrayList<Interval> result = new ArrayList<Interval>();
if (intervals == null || intervals.size() == 0) {
result.add(newInterval);
return result;
}
for (Interval interval : intervals) {
// 當目前的區間在新區間的前面時,且沒有重疊,則直接把當前的區間放入結果中。
if (interval.end < newInterval.start) {
result.add(interval);
} else if (interval.start > newInterval.end) {
result.add(newInterval);
newInterval = interval;
} else if (newInterval.start <= interval.end || newInterval.end >= interval.start) {
// 在此只是先把 newInterval更新並末加入 list中
int start = Math.min(newInterval.start, interval.start);
int end = Math.max(newInterval.end, interval.end);
newInterval = new Interval(start, end);
}
}
// 因很有可能newInterval 比 intervals 的最後一個還大,
// 或是第三個狀況更新了 newInterval 而還沒加入
// 記得在最後把 newInterval 加入到 list中。
result.add(newInterval);
return result;
}