LeetCode 题解 56. Merge Intervals
题目大意:给出一组区间,合并他们。
首先是排序,首先看start,start小的在前面。start相同的话,end小的在前面。
排序以后,要合并了。
我自己的笨方法,说实在的问题真的很多。提交了好几次才成功。
[1,2] [1, 3] [2,4]
我的判断标准是 a[i].end > a[i+1].start
很肤浅啊! 直到提示WA。给出了输入是类似这种。[1,10] [1,3] [8,9]
后面不连续了,但是仍然被前面覆盖。
所以,应该以第i个作为一个区间,不断扩充它的end值。
直到和后面那个完全不重合了,才停止。
PS:自己写一个快速排序,也是问题多多啊!!!
首先是交换两个元素swap,都不会写了!!!想当然的就写错了!!!
然后,结构体直接赋值,居然也疑惑了,怀疑能不能直接赋值。。。
最后,判断cmp也错了。。。
/**
* Definition for an interval.
* struct Interval {
* int start;
* int end;
* };
*/
/**
* Return an array of size *returnSize.
* Note: The returned array must be malloced, assume caller calls free().
*/
bool cmp(struct Interval x, struct Interval y)
{
return x.start < y.start || x.start == y.start && x.end < y.end;
} void swap(struct Interval *x, struct Interval *y)
{
struct Interval tmp = *x;
*x = *y;
*y = tmp;
} int partition(struct Interval* a, int n)
{
int last = n-;
int i,j;
for(i = ,j=; i < n;i++)
{
if(cmp(a[i],a[last]))
{
swap(&a[i],&a[j]);
j++;
}
}
swap(&a[j],&a[last]);
return j;
}
void quick_sort(struct Interval *a ,int n)
{
int j;
if(n < ) return; j = partition(a,n);
quick_sort(a,j);
quick_sort(a+j+,n--j);
} struct Interval* merge(struct Interval* intervals, int intervalsSize, int* returnSize) {
struct Interval *a = intervals;
int n = intervalsSize; if(n < ) return a; struct Interval* ans = (struct Interval* )malloc(n*sizeof(struct Interval));
int len = ; quick_sort(a,n); for(int i = ; i < n; i ++)
{
int max_end = a[i].end;
int min_start = a[i].start; while(i < n- && a[i+].start <= max_end) //a[i].end > a[i+1].start //只要下一个数的起始点还在这个大区间内。
{
i++;
if(a[i].end > max_end) max_end = a[i].end;
}
ans[len].start = min_start;
ans[len].end = max_end;
len ++;
}
*returnSize = len;
return ans;
}
while的代码是,只要下一个值的start比最大的end小,就更新end 的值。
最后把整个的区间放到结果里面。
第二种方式,参考了网上的方法。更合理,更不易出错。
先放入第一个区间,然后对于每一个区间,判断和ans中的最后一个区间是否重叠,有重叠就合并。没有就新增。
struct Interval* merge(struct Interval* intervals, int intervalsSize, int* returnSize) {
struct Interval *a = intervals;
int n = intervalsSize;
if(n < ) return a;
struct Interval* ans = (struct Interval* )malloc(n*sizeof(struct Interval));
int len = ;
quick_sort(a,n);
ans[] = a[];
len = ;
for(int i = ; i < n; i ++)
{
if(ans[len-].end < a[i].start) //没有交集
{
ans[len].start = a[i].start;
ans[len].end = a[i].end;
len ++;
}
else //有交集,取最大的。
{
ans[len-].end = ans[len-].end > a[i].end ? ans[len-].end : a[i].end;
}
}
*returnSize = len;
return ans;
}
LeetCode 题解 56. Merge Intervals的更多相关文章
- [Leetcode][Python]56: Merge Intervals
# -*- coding: utf8 -*-'''__author__ = 'dabay.wang@gmail.com' 56: Merge Intervalshttps://oj.leetcode. ...
- 【LeetCode】56. Merge Intervals
Merge Intervals Given a collection of intervals, merge all overlapping intervals. For example,Given ...
- leetcode个人题解——#56 Merge Intervals
思路,先按照结构体中start进行排序,然后遍历比较前后项是否有重合. 第一次用到三参数形式的sort(),第三个参数的bool函数要写到类外才通过. /** * Definition for an ...
- 【一天一道LeetCode】#56. Merge Intervals
一天一道LeetCode系列 (一)题目 Given a collection of intervals, merge all overlapping intervals. For example, ...
- 【LeetCode】56. Merge Intervals 解题报告(Python & C++ & Java)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...
- LeetCode OJ 56. Merge Intervals
题目 Given a collection of intervals, merge all overlapping intervals. For example, Given [1,3],[2,6], ...
- [leetcode sort]56. Merge Intervals
Given a collection of intervals, merge all overlapping intervals. For example,Given [1,3],[2,6],[8,1 ...
- leetcode 56. Merge Intervals 、57. Insert Interval
56. Merge Intervals是一个无序的,需要将整体合并:57. Insert Interval是一个本身有序的且已经合并好的,需要将新的插入进这个已经合并好的然后合并成新的. 56. Me ...
- 56. Merge Intervals - LeetCode
Question 56. Merge Intervals Solution 题目大意: 一个坐标轴,给你n个范围,把重叠的范围合并,返回合并后的坐标对 思路: 先排序,再遍历判断下一个开始是否在上一个 ...
随机推荐
- Spring @Async使用方法总结
引言: 在Java应用中,绝大多数情况下都是通过同步的方式来实现交互处理的:但是在处理与第三方系统交互的时候,容易造成响应迟缓的情况,之前大部分都是使用多线程来完成此类任务,其实,在spring 3. ...
- windows server 2008 R2 安装
微软服务器操作系统大致有: server 2000(简称2K),还有server 2003(2K3),server 2008(2K8),server 2000和2003是基于NT内核的,而2008是基 ...
- [UE4]删除动画:Remove from frame 5 to frame 18
从当前帧开始删除到结尾的动画帧
- 解决在word中不能使用输入法
打开一个Word文档-------------->单击 文件---->选项---->高级---->取消什么?看图 然后重新启动word
- Linux下rz,sz与ssh的配合使用
Linux下rz,sz与ssh的配合使用 一般来说,linux服务器大多是通过ssh客户端来进行远程的登陆和管理的,使用ssh登陆linux主机以后,如何能够快速的和本地机器进行文件的交互呢,也就是上 ...
- SAS数据集推送到sql server 数据库 实现代码段
libname fdsas ODBC datasrc=fdsas user=fdsas password=fdsas123 preserve_tab_names=yes connection=shar ...
- Meet in the middle学习笔记
Meet in the middle(MITM) Tags:搜索 作业部落 评论地址 PPT中会讲的很详细 当搜索的各项互不影响(如共\(n\)个物品前\(n/2\)个物品选不选和后\(n/2\)个物 ...
- (转)深入sql server中的事务
原文地址:http://www.cnblogs.com/chnking/archive/2007/05/27/761209.html 参考文章:http://www.cnblogs.com/zhuif ...
- 微信小程序学习笔记1--小程序的代码构成
最近打算学习一下微信小程序,看了微信公众平台的文档感觉还比较简单,就从这个方向重新找回学习的状态吧: 1.先了解一下小程序的代码构成: 创建项目后会看到四种后缀的文件: .json 后缀的 JSON ...
- 在Django中运行脚本文件以及打印出SQL语句。
Django终端打印SQL语句 在Django项目的settings.py文件中,在最后复制粘贴如下代码: LOGGING = { 'version': 1, 'disable_existing_lo ...