標籤:java leetcode
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].
題意:該題與56題很類似,不過題意給出每個區間的start是遞增的,所以我們不需要排序。該題需要我們添加一個區間,然後進行融合。這題在56題的基礎上增加了區間判斷的複雜度。
包含如下如所示的六種情況。
而這六種情況又可以合并成三種解決方式。看如下代碼:
/** * Definition for an interval. * public class Interval { * int start; * int end; * Interval() { start = 0; end = 0; } * Interval(int s, int e) { start = s; end = e; } * } */public class Solution { public List<Interval> insert(List<Interval> intervals, Interval newInterval) { // 先判斷newInterval是否在intervals的範圍內 if (newInterval == null) return intervals; int len = intervals.size(); if (len == 0) { intervals.add(newInterval); return intervals; } List<Interval> res=new ArrayList<Interval>(); for(Interval interval:intervals) { if(interval.end<newInterval.start)//newInterval在中間的情況 { res.add(interval); }else if(interval.start>newInterval.end)//newInterval插入最前端的情況 { res.add(newInterval); newInterval=interval;//這個地方很重要,就是找到了待插入區間位置,指定新的newInterval,因為intervals中的區間也可能有相交的地方,需要融合。 }else if(interval.start<=newInterval.end||interval.end>=newInterval.start)//有重合部分的四種情況 { newInterval=new Interval(Math.min(interval.start,newInterval.start),Math.max(interval.end,newInterval.end)); } } res.add(newInterval); return res; }}
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。
[Java]LeetCode57 Insert Interval