#56 Merge intervals

public List<Interval> merge(List<Interval> intervals) {}

以上是题目和例子。

做法:(忘了是自己写出来的还是参考答案的orz)

 1. 先把interval的start和end points分别取出来,放到array里,再用Array.sort(...),把所有起点之间排序,然后把所有终止点之间排序。

2. 然后用一个for循环,循环过每一个interval,但是实际上查看的是,按大小排序的start point以及end point。设置两个指针,一个指向现在正在寻找的start point,一个指向现在正在寻找的end point。如果当前的end point大于等于下一个start point,就直接到下个interval接着找,如果当前的end point小于下一个start,就把现在的end point当做end,然后把之前预设的start当做start,组成一个interval塞进result list里。

3. Time complexity: O(nlogn) because of the sorting algorithm

Space complexity: O(n) because I am building a result list

我的代码:

/**
 * 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; }
 * }
 */
class Solution {
    public List<Interval> merge(List<Interval> intervals) {
        int n = intervals.size();
        int[] starts = new int[n];
        int[] ends = new int[n];
        for (int i = 0; i < n; i++) {
            starts[i] = intervals.get(i).start;
            ends[i] = intervals.get(i).end;
        }
        Arrays.sort(starts);
        Arrays.sort(ends);
        // loop through
        List<Interval> res = new ArrayList<Interval>();
        for (int i = 0, j = 0; i < n; i++) { // j is start of interval.
            if (i == n - 1 || starts[i + 1] > ends[i]) {
                res.add(new Interval(starts[j], ends[i]));
                j = i + 1;
            }
        }
        return res;
    }
}

有几个要注意的点:

1. 当iteration的指针移到最后一个的时候,无论如何都要把当前的interval塞进去。因为如果这个interval可以和之前的interval合并的话,end point已经更新到现在这个interval了,所以可以直接把当前interval加入到result里。如果这个interval不能和之前的interval合并,当前的interval也要当做一个单独的interval加入到result里面,因为最后一个不加不行。所以,在loop里面的if判断里,可以用一个 || 来同时包括两种情况。

2. variable定义要clean。

猜你喜欢

转载自www.cnblogs.com/yxcindy/p/9944545.html
今日推荐