当前位置:网站首页>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 <= 104intervals[i].length == 20 <= 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;
}
边栏推荐
猜你喜欢

【图像增强】基于Step和Polynomial 滤波实现图像增强附matlab代码

原文翻译:Structure Aware Single-stage 3D Object Detection from Point Cloud

xml引配置文件

最新工业界推荐系统数据集-召回排序模型原理、结构及代码实战整理分享

历史最全DL相关书籍、课程、视频、论文、数据集、会议、框架和工具整理分享

Jenkins的环境部署,(打包、发布、部署、自动化测试)

2022年自然语言处理校招社招实习必备知识点盘点分享

The building had been registry cluster, load balancing

一款免费的强大办公工具。

2022年最流行的自动化测试工具有哪些?全网最全最细都在这里了
随机推荐
书签收藏难整理?这款书签工具管理超方便
JS 截取数组的最后几个元素
C#计算两个时间相差多少天、时、分、秒
dice和iou
Hudi从内核到实战介绍
第一部分:和数组相关的问题
全志通过fastboot烧写boot.img
Open3D 均匀采样
SwiftUI * Grid
【洛谷】P1082 同余方程
Yii2开启 Schema 缓存
高性能 MySQL(十二):分区表
2022年自然语言处理校招社招实习必备知识点盘点分享
20220530设计问题:常数时间插入、删除和获取随机元素
全文翻译:Multimodal Neural Networks: RGB-D for Segmantic Segmentation and Object Detection
VS2019编译boost_1_79,生成32位和64位静态库
Redis系列文章导航
Tricore架构上的调试案例
Processing Point Clouds
MVVM项目开发(商品管理系统二)