1. 程式人生 > >19.2.9 [LeetCode 57] Insert Interval

19.2.9 [LeetCode 57] Insert Interval

start ase close hat app 很多 output ping with

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:

Input: intervals = [[1,3],[6,9]], newInterval = [2,5]
Output: [[1,5],[6,9]]

Example 2:

Input: intervals = [[1,2],[3,5],[6,7],[8,10],[12,16]]
, newInterval = [4,8] Output: [[1,2],[3,10],[12,16]] Explanation: Because the new interval [4,8] overlaps with [3,5],[6,7],[8,10].

題意

給定一組以左邊界大小排列的互不重合的閉區間,求加入一個新區間後的集合(也需要從小到大排列)

題解

一開始做的十分復雜

技術分享圖片
 1 class Solution {
 2 public:
 3     vector<Interval> insert(vector<Interval>& intervals, Interval newInterval) {
4 if (intervals.size() < 1) { 5 intervals.push_back(newInterval); 6 return intervals; 7 } 8 int s = newInterval.start, e = newInterval.end, i; 9 for (i = 0; i < intervals.size(); i++) { 10 if (intervals[i].start <= s && intervals[i].end >= s) {
11 if (e <= intervals[i].end) 12 return intervals; 13 break; 14 } 15 else if (intervals[i].start > s) { 16 if(intervals[i].start>e) { 17 intervals.insert(intervals.begin()+i,newInterval); 18 return intervals; 19 } 20 intervals[i].start = s; 21 if (e <= intervals[i].end) 22 return intervals; 23 break; 24 } 25 } 26 int mark = i; 27 i++; 28 for (; i < intervals.size(); ) { 29 if (intervals[i].start > e) { 30 intervals[mark].end = e; 31 return intervals; 32 } 33 else if (intervals[i].end >= e) { 34 intervals[mark].end = intervals[i].end; 35 intervals.erase(intervals.begin() + i); 36 return intervals; 37 } 38 intervals.erase(intervals.begin() + i); 39 } 40 if(mark>=intervals.size()) 41 intervals.push_back(newInterval); 42 else 43 intervals[mark].end = e; 44 return intervals; 45 } 46 };
View Code

需要考慮很多條件,於是重寫

技術分享圖片
 1 class Solution {
 2 public:
 3     vector<Interval> insert(vector<Interval>& intervals, Interval newInterval) {
 4         int i = 0, s = newInterval.start, e = newInterval.end;
 5         vector<Interval>ans;
 6         while (i < intervals.size() && intervals[i].end < s) {
 7             ans.push_back(intervals[i]);
 8             i++;
 9         }
10         int left = s, right = e;
11         while (i < intervals.size() && intervals[i].start <= e) {
12             left = min(left, intervals[i].start);
13             right = max(right, intervals[i].end);
14             i++;
15         }
16         ans.push_back(Interval(left, right));
17         while (i < intervals.size()) {
18             ans.push_back(intervals[i]);
19             i++;
20         }
21         return ans;
22     }
23 };
View Code

這個就快得多了……

19.2.9 [LeetCode 57] Insert Interval