#56 Merge Intervals

Dropbox phone interview的download chunk是從這題改的。

題目提供Interval資料結構,裡面有起始index和終止index。

input是List<Interval>,是一個List裡存了很多"區間",其中有些區間有重疊的部分,

目標是將有重疊的區間結合成一個大區間,最後回傳List<Interval>。

做法是將所有Interval依照startIndex排序,

排序完就可以依序讀取,當current Interval的startIndex < 前一個Interval的endIndex,表示兩區間重疊,

則呼叫另一個function: merge,將兩區間結合。

另外一個做法是宣告一個boolean array(bitset),

依序讀取Interval時就把區間包含到的所有element設為true(1),

最後再讀取boolean array把連續1的區間輸出。

這個方法在leetcode不會過,因為leetcode要求完全重疊才要merge,接合的不可以,

例如[1,4] [5,8]不可以輸出成[1,8],[1,5][5,8]才可以。

完整程式碼:

/**
 * 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> merge(List<Interval> intervals) {
        List<Interval> ans = new ArrayList<>();
        //sort intervals by start implemented by collection.sort

        Collections.sort(intervals, new Comparator<Interval>(){
            @Override
            public int compare(Interval i1, Interval i2) {
                return Integer.compare(i1.start, i2.start);
            }
        });

        //while(intervals.size()>0)
        //  cur = intervals.get(0)
        //  delete cur from intervals
        //  Interval mergeCur = merge(intervals, cur) // merge all Interval in intervals that can be merge with cur
        //  add mergeCur to ans
        while(intervals.size()>0){
            Interval cur = intervals.get(0);
            intervals.remove(0);
            Interval mergeCur = merge(intervals, cur);
            ans.add(mergeCur);
        }
        return ans;

    }
        //function: Interval merge(intervals, cur)
        //int start = cur.start 
        //int end = cur.end 
        //for each Interval in intervals
        //  if(start in Interval || end in Interval)
        //      expand cur
        //      change value of start or end
        //      delete Interval
        //  else continue
        //return Interval

        Interval merge(List<Interval> intervals, Interval cur){
            int start = cur.start;
            int end = cur.end;
            int n = intervals.size();
            for(int j=0; j<n; j++){
                Interval i = intervals.get(0);
                if( i.start <= end ){
                    start = Math.min(start, i.start);
                    end = Math.max(end, i.end);
                    intervals.remove(0);
                }
                else continue;
            }
            return new Interval(start, end);
        }
}

results matching ""

    No results matching ""