给出一组区间,请合并所有重叠的区间。
请保证合并后的区间按区间起点升序排列。
//"区间"定义
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;
}