给出一组区间,请合并所有重叠的区间。
请保证合并后的区间按区间起点升序排列。
//"区间"定义 class Interval { int start; //起点 int end; //终点 }
数据范围:区间组数
,区间内 的值都满足
要求:空间复杂度
,时间复杂度
进阶:空间复杂度
,时间复杂度
//"区间"定义 class Interval { int start; //起点 int end; //终点 }
[[10,30],[20,60],[80,100],[150,180]]
[[10,60],[80,100],[150,180]]
[[0,10],[10,20]]
[[0,20]]
#define len 200000 #include <stdlib.h> int com(const void* a, const void* b) { return ((struct Interval *)a)->start - ((struct Interval *)b)->start; } struct Interval* merge(struct Interval* intervals, int intervalsLen, int* returnSize ) { // write code here int i, j = 0; // *returnSize = intervalsLen; struct Interval result[len]; if(intervalsLen == 0) { return NULL; } qsort(intervals, intervalsLen, sizeof(struct Interval), com); result[0].start = intervals[0].start; result[0].end = intervals[0].end; for(i = 1; i < intervalsLen; i++) { if(result[j].end > intervals[i].end) { continue; } if(result[j].end >= intervals[i].start) { result[j].end = intervals[i].end; } else { j++; result[j].start = intervals[i].start; result[j].end = intervals[i].end; } } *returnSize = j + 1; return result; }
void ChargeInterval(struct Interval* s, struct Interval* t) { struct Interval buffer; memcpy((unsigned char*)&buffer, (unsigned char*)s, sizeof(struct Interval)); memcpy((unsigned char*)s, (unsigned char*)t, sizeof(struct Interval)); memcpy((unsigned char*)t, (unsigned char*)&buffer, sizeof(struct Interval)); } struct Interval* merge(struct Interval* intervals, int intervalsLen, int* returnSize ) { // write code here struct Interval* returnIntervals; returnIntervals = (struct Interval*)malloc(intervalsLen * sizeof(struct Interval)); memset((unsigned char*)returnIntervals, 0, intervalsLen * sizeof(struct Interval)); if (!intervalsLen) { *returnSize = 0; return returnIntervals; } memcpy((unsigned char*)returnIntervals, (unsigned char*)intervals, intervalsLen * sizeof(struct Interval)); *returnSize = intervalsLen; { long long i, j; for (i = 0; i < intervalsLen; i++) { if(returnIntervals[i].start<0 && returnIntervals[i].end<0) continue; for (j = 0; j < intervalsLen; j++) { if(i==j) continue; if(returnIntervals[j].start<0 && returnIntervals[j].end<0) continue; if(!(returnIntervals[i].start>returnIntervals[j].end || returnIntervals[i].end<returnIntervals[j].start)) { struct Interval buffer; memcpy((unsigned char*)&buffer, (unsigned char*)&returnIntervals[i], sizeof(struct Interval)); returnIntervals[i].start = (buffer.start>returnIntervals[j].start)?returnIntervals[j].start:buffer.start; returnIntervals[i].end = (buffer.end<returnIntervals[j].end)?returnIntervals[j].end:buffer.end; returnIntervals[j].start = -1; returnIntervals[j].end = -1; } } } { struct Interval* buffer; buffer = (struct Interval*)malloc(intervalsLen * sizeof(struct Interval)); memcpy((unsigned char*)buffer, (unsigned char*)returnIntervals, intervalsLen * sizeof(struct Interval)); for (i=0,j=0; j<intervalsLen; j++) { if (!(returnIntervals[j].start<0 && returnIntervals[j].end<0)) { memcpy((unsigned char*)&returnIntervals[i], (unsigned char*)&buffer[j], sizeof(struct Interval)); i++; } } (*returnSize) = i; } for (i = 0; i < (*returnSize); i++) for (j = i; j < (*returnSize); j++) { if (returnIntervals[j].start < returnIntervals[i].start) ChargeInterval(&(returnIntervals[i]),&(returnIntervals[j])); } } return returnIntervals; }
/** * struct Interval { * int start; * int end; * }; */ /** * * @param intervals Interval类一维数组 * @param intervalsLen int intervals数组长度 * @return Interval类一维数组 * @return int* returnSize 返回数组行数 */ #include <stdlib.h> #include <string.h> int compare(const void* _a, const void* _b) { struct Interval* a = (struct Interval *)_a; struct Interval* b = (struct Interval *)_b; if(a->start != b->start) { return a->start - b->start; } else { return a->end - b->end; } } struct Interval* merge(struct Interval* intervals, int intervalsLen, int* returnSize ) { // write code here struct Interval tmp[intervalsLen]; int index = 0; memset(tmp, -1, intervalsLen*sizeof(intervals[0])); //区间排序 qsort(intervals, intervalsLen, sizeof(intervals[0]), compare); for(int i = 0; i < intervalsLen; i++) { //未操作的结构体赋初值 if(tmp[index].start == -1) { tmp[index].start = intervals[i].start; tmp[index].end = intervals[i].end; } //末位防止溢出 if(i == intervalsLen-1) { tmp[index].end = intervals[i].end > tmp[index].end ? intervals[i].end : tmp[index].end; index++; break; } //当前区间尾大于下个区间尾则直接进入下一次循环 if(tmp[index].end >= intervals[i+1].end) { continue; } //当前区间尾大于下个区间头合并区间,否则结束当前区间,并索引后移一位 if(intervals[i].end >= intervals[i+1].start) { tmp[index].end = intervals[i+1].end; } else { tmp[index].end = intervals[i].end; index++; } } *returnSize = index; memcpy(intervals, tmp, index*sizeof(intervals[0])); return intervals; }
// 问题 运行超时。。。。 /** * struct Interval { * int start; * int end; * }; * * C语言声明定义全局变量请加上static,防止重复定义 */ /** * * @param intervals Interval类一维数组 * @param intervalsLen int intervals数组长度 * @return Interval类一维数组 * @return int* returnSize 返回数组行数 */ struct Interval* merge(struct Interval* intervals, int intervalsLen, int* returnSize ) { // write code here struct Interval merg[200000]; int k1 = 0; int k = 0; int vis[200000]; memset(vis,0, sizeof(vis)); // 先排序 for(int i=0;i<intervalsLen;i++){ for(int j=i+1;j<intervalsLen;j++){ if(intervals[i].start>intervals[j].start){ struct Interval tmp = intervals[i]; intervals[i] = intervals[j]; intervals[j] = tmp; } } } for(int i=0;i<intervalsLen;i++){ if(vis[i]==1) continue; vis[i] = 1; for(int j = i+1;j<intervalsLen;j++){ if(vis[j]==1) continue; if(intervals[i].end>=intervals[j].end){ if(intervals[j].start>=intervals[i].start){ // j区间包含在i区间内 必须先判断 vis[j]=1; } else if(intervals[j].end>=intervals[i].start){ intervals[i].start = intervals[j].start; vis[j]=1; } } else if(intervals[j].end>=intervals[i].end){ if(intervals[i].start>=intervals[j].start){ // i区间包含在j区间内 intervals[i] = intervals[j]; vis[j]=1; } else if(intervals[i].end>=intervals[j].start){ intervals[i].end = intervals[j].end; vis[j]=1; } } } merg[k++] = intervals[i]; } *returnSize = k; return merg; }