【LeetCode】

区间。LeetCode第56题和57题。

56.  Insert Interval

下面这种解法是原地插入的方法,显然比新建一个列表省空间。

 1 /* Given a set of non-overlapping intervals, insert a new interval into the intervals (merge if necessary).
 2 
 3 You may assume that the intervals were initially sorted according to their start times.
 4 
 5 Example 1:
 6 Given intervals [1,3],[6,9], insert and merge [2,5] in as [1,5],[6,9].
 7 
 8 Example 2:
 9 Given [1,2],[3,5],[6,7],[8,10],[12,16], insert and merge [4,9] in as [1,2],[3,10],[12,16].
10 
11 This is because the new interval [4,9] overlaps with [3,5],[6,7],[8,10]. */
12 
13 
14 /**
15  * Definition for an interval.
16  * public class Interval {
17  *     int start;
18  *     int end;
19  *     Interval() { start = 0; end = 0; }
20  *     Interval(int s, int e) { start = s; end = e; }
21  * }
22  */
23 class Solution {
24     public List<Interval> insert(List<Interval> intervals, Interval newInterval) {
25         int i = 0;
26         while(i < intervals.size() && intervals.get(i).end < newInterval.start)
27             i++;
28         while(i < intervals.size() && intervals.get(i).start <= newInterval.end){
29             newInterval = new Interval(Math.min(intervals.get(i).start, newInterval.start), Math.max(intervals.get(i).end, newInterval.end));
30             intervals.remove(i);
31         }
32         intervals.add(i, newInterval);
33         return intervals;
34     }
35 }

57 Merge Intervals

三种解法,三种思路 ,第一种最快。

 1 /* Given a collection of intervals, merge all overlapping intervals.
 2 
 3 For example,
 4 Given [1,3],[2,6],[8,10],[15,18],
 5 return [1,6],[8,10],[15,18]. */
 6 
 7 /**
 8  * Definition for an interval.
 9  * public class Interval {
10  *     int start;
11  *     int end;
12  *     Interval() { start = 0; end = 0; }
13  *     Interval(int s, int e) { start = s; end = e; }
14  * }
15  */
16  
17 //Solution1
18 // The idea is that for the result distinct Interval, the latter one's start must > previous one's end.
19 class Solution {
20     public List<Interval> merge(List<Interval> intervals) {
21         int n = intervals.size();
22         int[] start = new int[n];
23         int[] end = new int[n];
24         for(int i = 0; i < n; i++){
25             start[i] = intervals.get(i).start;
26             end[i] = intervals.get(i).end;
27         }
28         Arrays.sort(start);
29         Arrays.sort(end);
30         List<Interval> res = new ArrayList<>();
31         for(int i = 0, j = 0; i < n; i++) {
32             if(i == n - 1 || start[i+1] > end[i]){
33                 res.add(new Interval(start[j], end[i]));
34                 j = i + 1;
35             }
36         }
37         return res;
38     }
39 }
40 
41 //Solution2
42 //The idea is to sort the intervals by their starting points.
43 class Solution {
44     public List<Interval> merge(List<Interval> intervals) {
45         if(intervals.size() <= 1)
46             return intervals;
47         intervals.sort((i1, i2) -> Integer.compare(i1.start, i2.start));
48         int start = intervals.get(0).start;
49         int end = intervals.get(0).end;
50         List<Interval> res = new ArrayList<>();
51         for(Interval i : intervals){
52             if(i.start <= end)
53                 end = Math.max(end, i.end); // attention this line, important
54             else{
55                 res.add(new Interval(start, end));
56                 start = i.start;
57                 end = i.end;
58             }
59         }
60         res.add(new Interval(start, end));
61         return res;
62     }
63 }
64 
65 //Solution3
66 //use the Insert Interval code, construct a new list, and insert every interval into it
67 //to reuse the existing code or thoughts is very useful and should take care of it

 

posted on 2017-09-06 21:29  MicN  阅读(390)  评论(0编辑  收藏  举报