题目大意:给出一组区间,合并他们。

首先是排序,首先看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的更多相关文章

  1. [Leetcode][Python]56: Merge Intervals

    # -*- coding: utf8 -*-'''__author__ = 'dabay.wang@gmail.com' 56: Merge Intervalshttps://oj.leetcode. ...

  2. 【LeetCode】56. Merge Intervals

    Merge Intervals Given a collection of intervals, merge all overlapping intervals. For example,Given  ...

  3. leetcode个人题解——#56 Merge Intervals

    思路,先按照结构体中start进行排序,然后遍历比较前后项是否有重合. 第一次用到三参数形式的sort(),第三个参数的bool函数要写到类外才通过. /** * Definition for an ...

  4. 【一天一道LeetCode】#56. Merge Intervals

    一天一道LeetCode系列 (一)题目 Given a collection of intervals, merge all overlapping intervals. For example, ...

  5. 【LeetCode】56. Merge Intervals 解题报告(Python & C++ & Java)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...

  6. LeetCode OJ 56. Merge Intervals

    题目 Given a collection of intervals, merge all overlapping intervals. For example, Given [1,3],[2,6], ...

  7. [leetcode sort]56. Merge Intervals

    Given a collection of intervals, merge all overlapping intervals. For example,Given [1,3],[2,6],[8,1 ...

  8. leetcode 56. Merge Intervals 、57. Insert Interval

    56. Merge Intervals是一个无序的,需要将整体合并:57. Insert Interval是一个本身有序的且已经合并好的,需要将新的插入进这个已经合并好的然后合并成新的. 56. Me ...

  9. 56. Merge Intervals - LeetCode

    Question 56. Merge Intervals Solution 题目大意: 一个坐标轴,给你n个范围,把重叠的范围合并,返回合并后的坐标对 思路: 先排序,再遍历判断下一个开始是否在上一个 ...

随机推荐

  1. 事件之父View和子view的点击事件的执行过程

    Android中的事件类型分为按键事件和屏幕触摸事件,Touch事件是屏幕触摸事件的基础事件,有必要对它进行深入的了解. 一个最简单的屏幕触摸动作触发了一系列Touch事件:ACTION_DOWN-& ...

  2. [UE4]最简单的虚幻4网络游戏,使用虚幻4内置服务器

    一.设置游戏窗口合适的大小 二.在新窗口中运行游戏.玩家数量改成大于1.   三.运行游戏就会打开多个窗口 在打包完成的游戏中进行网络游戏: 一.虚幻4打包好的文件是放在WindowsNoEditor ...

  3. [UE4]IsValid方法妙用

    由于UE4中各个对象的创建顺序无法保证,因此可以使用IsValid方法判断一个对象是否有效,如果无效则初始化,如果有效则直接可以使用.

  4. winfrom 窗体控件实现二级联动

    ComboBox绑定数据源时触发SelectedIndexChanged事件的处理办法 事件,而这个时候用户并没有选择内容,其SelectedValue也不是对应字段的值.那么时写在SelectedI ...

  5. linux安装phpstorm

    1.下载phpStorm安装包,下载地址:https://download.jetbrains.8686c.com/webide/PhpStorm-2018.3.1.tar.gz 2.解压到/usr/ ...

  6. tomcat7.0安装笔记

    1. 解压,新增系统环境变量CATALINA_HOME,值为tomcat所在目录,如E: tomcat7.0 PS:安装JAVA时没有配置系统变量JAVA_HOME,导致报错无法启动tomcat,新建 ...

  7. liinux安装 mysql 及主从复制

    mariadb其实就是mysqlmysql已经被oracle收购,它即将闭源,马上要开始收费了因此还想免费试用开源的数据库mysql,就在centos7上,将mysql分支为mariadb 安装mar ...

  8. WPF Storyboard 动画播放完毕时触发的事件

    /*故事版*/ Storyboard ClSto2; public PopUpWindow() { /*播放完毕,将当前窗体关闭*/ ClSto2.Completed += (s, e) => ...

  9. 零基础学习python_字典(25-26课)

    今天学到后面的知识,突然发现之前学习到的字典列表啥的都有点忘了,打算补一下之前学到的字典,到时候你看的时候,字符串.列表.字典.元祖这几个没啥顺序,刚开始学的时候了解下方法,当然你可以死记硬背下,后面 ...

  10. 【Selenium-WebDriver自学】Selenium网格化(十六)

    参考链接: http://www.yiibai.com/selenium/selenium_grids.html 命令: cd E:\Yingpu\000.SVNYP\01.个人文件夹\Renqian ...