#56 Merge intervals
Posted yxcindy
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了#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。
以上是关于#56 Merge intervals的主要内容,如果未能解决你的问题,请参考以下文章
java 56.Merge Intervals #LeetCode #Interval
56. Merge Intervals - LeetCode