当前位置:网站首页>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;
}
边栏推荐
- A40i gxl3680 ts_print报错:tslib: Selected device is not a touchscreen (must support ABS and KEY event
- OJ:L3-001 凑零钱 DFS
- Processing Point Clouds
- Recently, I have seen a lot of people who want to study by themselves or enroll in classes but don’t know how to choose. I will tell you about it today.
- 快速乘写法
- 数字 06 verilog_关于异步FIFO
- OJ:L2-012 关于堆的判断
- 科大讯飞笔试题复盘
- JS 实现千分位分隔符
- MySQL/Oracle字符串分割
猜你喜欢
随机推荐
Lottie进阶和原理分析
独立机器连接cdh的spark集群,远程提交任务(绝对可以成功,亲测了n遍)
7月更新速递 | 产品实验室N+1,EasyV For Unreal上线!
<爆>2022中文版-《海外博士申请指南-材料准备、时间线、套磁、面试及录取》免费分享
【Untitled】
Jenkins配置钉钉通知
Redis中SDS简单动态字符串
攀爬倒影发光方块
【es6】教程 Symbol数据以及迭代器和生成器
20220523搜索和排序:搜索旋转排序数组
Redis - 时间序列数据类型的保存方案和消息队列实现
1261. 在受污染的二叉树中查找元素
Appium常用操作及H5页面元素定位
如何实现canal数据同步
【剑指offer65】不适用加减乘除做加法
OJ:L2-012 关于堆的判断
【Jenkins 学习笔记】玩转持续集成与持续交付
一款免费的强大办公工具。
Kubernetes:(十五)PV与PVC的《恩怨情仇》
DataGridView在多线程中出现大红叉









