1. 程式人生 > >合並數組

合並數組

turn fin ray qsort caller turned 輸入 int 返回

給出一個區間的集合,請合並所有重疊的區間。

示例 1:

輸入: [[1,3],[2,6],[8,10],[15,18]]
輸出: [[1,6],[8,10],[15,18]]
解釋: 區間 [1,3] 和 [2,6] 重疊, 將它們合並為 [1,6].

示例 2:

輸入: [[1,4],[4,5]]
輸出: [[1,5]]
解釋: 區間 [1,4] 和 [4,5] 可被視為重疊區間。

將數組按照start進行排序,先把第一個區間扔進返回數組,然後遍歷剩下的區間,如果該區間和返回數組尾部的區間重疊,就把它們合並,不然就把該區間扔進返回數組。

/**
 * Definition for an interval.
 * struct Interval {
 *     int start;
 *     int end;
 * };
 
*/ /** * Return an array of size *returnSize. * Note: The returned array must be malloced, assume caller calls free(). */ int cmp(struct Interval *a,struct Interval *b) { return a->start-b->start; } struct Interval* merge(struct Interval* intervals, int intervalsSize, int* returnSize) {
if(intervalsSize<1) return NULL; qsort(intervals,intervalsSize,sizeof(struct Interval),cmp); int i; int size=0; struct Interval *a=(struct Interval *)malloc(sizeof(struct Interval)); a[size].start=intervals[0].start; a[size++].end=intervals[0].end; for(i=1;i<intervalsSize;i++) {
if(intervals[i].start>a[size-1].end) { a=(struct Interval *)realloc(a,sizeof(struct Interval)*(size+1)); a[size].start=intervals[i].start; a[size++].end=intervals[i].end; } else { a[size-1].end=intervals[i].end>a[size-1].end?intervals[i].end:a[size-1].end; } } *returnSize=size; return a; }

合並數組