当前位置:网站首页>C语言力扣第56题之合并区间。排序+双指针
C语言力扣第56题之合并区间。排序+双指针
2022-08-09 02:47:00 【管二狗绝不摆烂】
以数组 intervals
表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi]
。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。
示例 1:
输入:intervals = [[1,3],[2,6],[8,10],[15,18]] 输出:[[1,6],[8,10],[15,18]] 解释:区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].
示例 2:
输入:intervals = [[1,4],[4,5]] 输出:[[1,5]] 解释:区间 [1,4] 和 [4,5] 可被视为重叠区间。
提示:
1 <= intervals.length <= 104
intervals[i].length == 2
0 <= starti <= endi <= 104
- 对 vector<vector<int>> 排序,需要按照先比较区间开始,如果相同再比较区间结束,使用默认的排序规则即可
- 使用双指针,左边指针指向当前区间的开始
- 使用一个变量来记录连续的范围 t
- 右指针开始往后寻找,如果后续的区间的开始值比 t 还小,说明重复了,可以归并到一起
- 此时更新更大的结束值到 t
- 直到区间断开,将 t 作为区间结束,存储到答案里
- 然后移动左指针,跳过中间已经合并的区间
/**
* Return an array of arrays of size *returnSize.
* The sizes of the arrays are returned as *returnColumnSizes array.
* Note: Both returned array and *columnSizes array must be malloced, assume caller calls free().
*/
struct vat
{
int start;
int end;
};
int compare(struct vat* a,struct vat *b)
{
return a->start - b->start;
}
int** merge(int** intervals, int intervalsSize, int* intervalsColSize, int* returnSize, int** returnColumnSizes)
{
struct vat newVat[intervalsSize];
for(int i =0; i < intervalsSize; i++)
{
newVat[i].start = intervals[i][0];
newVat[i].end = intervals[i][1];
}
qsort(newVat,intervalsSize,sizeof(struct vat),compare);
int **returnInteval = (int **)malloc(sizeof(int *) * intervalsSize);
*returnColumnSizes = (int *)malloc(sizeof(int ) * intervalsSize);
*returnSize = 0;
for(int i =0; i < intervalsSize; i++)
{
if(*returnSize)
{
int preEnd = returnInteval[*returnSize-1][1];
if(newVat[i].start <= preEnd)
{
//合并
int maxEnd = fmax(preEnd,newVat[i].end);
returnInteval[*returnSize-1][1] = maxEnd;
}
else
{
//没有重合的
int newRow = *returnSize;
returnInteval[newRow] = (int *)malloc(sizeof(int ) * 2);
returnInteval[newRow][0] = newVat[i].start;
returnInteval[newRow][1] = newVat[i].end;
(*returnColumnSizes)[newRow] = 2;
*returnSize = *returnSize + 1;
}
}
else
{
int newRow = *returnSize;
returnInteval[newRow] = (int *)malloc(sizeof(int ) * 2);
returnInteval[newRow][0] = newVat[i].start;
returnInteval[newRow][1] = newVat[i].end;
(*returnColumnSizes)[newRow] = 2;
*returnSize = *returnSize + 1;
}
}
return returnInteval;
}
边栏推荐
猜你喜欢
随机推荐
工作小计 rtcp的length和网络字节序
接口的安全性测试,应该从哪些方面入手?
全志通过fastboot烧写boot.img
Open3D 点云曲率计算
ROS2错误:不支持OpenGL 1.5 GLRenderSystem:: ci initialiseContext在C: \ \ ws \构建……
Lottie进阶和原理分析
[LeetCode305周赛] 6136. 算术三元组的数目,6139. 受限条件下可到达节点的数目,6137. 检查数组是否存在有效划分,6138. 最长理想子序列
【物理应用】基于El-centro地震波作用下隔震与非隔震支座下的顶层位移、速度、加速度的对比情况附matlab代码
Programmer's Daily Life | Daily Fun
书签收藏难整理?这款书签工具管理超方便
JS 截取数组的最后几个元素
数字 06 verilog_关于异步FIFO
不会吧!不会吧!居然还有人不知道重绘以及回流
redis集群详解
Jenkins configuration nail notification
DSP28379学习笔记 (一)——GPIO基本操作
原文翻译:Structure Aware Single-stage 3D Object Detection from Point Cloud
整数溢出机制 C
button click animation
20220530设计问题:常数时间插入、删除和获取随机元素