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

首先是排序,首先看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也错了。。。

  1. /**
  2. * Definition for an interval.
  3. * struct Interval {
  4. * int start;
  5. * int end;
  6. * };
  7. */
  8. /**
  9. * Return an array of size *returnSize.
  10. * Note: The returned array must be malloced, assume caller calls free().
  11. */
  12. bool cmp(struct Interval x, struct Interval y)
  13. {
  14. return x.start < y.start || x.start == y.start && x.end < y.end;
  15. }
  16.  
  17. void swap(struct Interval *x, struct Interval *y)
  18. {
  19. struct Interval tmp = *x;
  20. *x = *y;
  21. *y = tmp;
  22. }
  23.  
  24. int partition(struct Interval* a, int n)
  25. {
  26. int last = n-;
  27. int i,j;
  28. for(i = ,j=; i < n;i++)
  29. {
  30. if(cmp(a[i],a[last]))
  31. {
  32. swap(&a[i],&a[j]);
  33. j++;
  34. }
  35. }
  36. swap(&a[j],&a[last]);
  37. return j;
  38. }
  39. void quick_sort(struct Interval *a ,int n)
  40. {
  41. int j;
  42. if(n < ) return;
  43.  
  44. j = partition(a,n);
  45. quick_sort(a,j);
  46. quick_sort(a+j+,n--j);
  47. }
  48.  
  49. struct Interval* merge(struct Interval* intervals, int intervalsSize, int* returnSize) {
  50. struct Interval *a = intervals;
  51. int n = intervalsSize;
  52.  
  53. if(n < ) return a;
  54.  
  55. struct Interval* ans = (struct Interval* )malloc(n*sizeof(struct Interval));
  56. int len = ;
  57.  
  58. quick_sort(a,n);
  59.  
  60. for(int i = ; i < n; i ++)
  61. {
  62. int max_end = a[i].end;
  63. int min_start = a[i].start;
  64.  
  65. while(i < n- && a[i+].start <= max_end) //a[i].end > a[i+1].start //只要下一个数的起始点还在这个大区间内。
  66. {
  67. i++;
  68. if(a[i].end > max_end) max_end = a[i].end;
  69. }
  70. ans[len].start = min_start;
  71. ans[len].end = max_end;
  72. len ++;
  73. }
  74. *returnSize = len;
  75. return ans;
  76. }

while的代码是,只要下一个值的start比最大的end小,就更新end 的值。

最后把整个的区间放到结果里面。

第二种方式,参考了网上的方法。更合理,更不易出错。

先放入第一个区间,然后对于每一个区间,判断和ans中的最后一个区间是否重叠,有重叠就合并。没有就新增。

  1. struct Interval* merge(struct Interval* intervals, int intervalsSize, int* returnSize) {
  2. struct Interval *a = intervals;
  3. int n = intervalsSize;
  4.  
  5. if(n < ) return a;
  6.  
  7. struct Interval* ans = (struct Interval* )malloc(n*sizeof(struct Interval));
  8. int len = ;
  9.  
  10. quick_sort(a,n);
  11.  
  12. ans[] = a[];
  13. len = ;
  14.  
  15. for(int i = ; i < n; i ++)
  16. {
  17. if(ans[len-].end < a[i].start) //没有交集
  18. {
  19. ans[len].start = a[i].start;
  20. ans[len].end = a[i].end;
  21. len ++;
  22. }
  23. else //有交集,取最大的。
  24. {
  25. ans[len-].end = ans[len-].end > a[i].end ? ans[len-].end : a[i].end;
  26. }
  27. }
  28. *returnSize = len;
  29. return ans;
  30. }

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. Python3中的赋值操作、浅拷贝与深拷贝

    一:关于赋值操作与浅拷贝 1.变量的赋值 首先以一个例子来说明一下:定义变量a = 1,使b = a.开始的情况下打印a与b都为1(显而易见,哈哈) 但是接下来,我们做一下改动,令 a = 222,再 ...

  2. VMware虚拟机上配置nginx后,本机无法访问问题(转载)

    转自:http://www.server110.com/nginx/201407/10794.html 把nginx装在CentOS上,用本机访问虚拟机的时候却出现了不能访问的问题,查了资料以后,原来 ...

  3. 超实用!9个目前流行的MATERIAL DESIGN前端框架

    http://www.uisdc.com/material-design-frameworks-top-9 谷歌推出的Material Design风格已见有一些APP UI采用,视觉和交互体验都很棒 ...

  4. (转)CS域和PS域

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/u013485792/article/details/50818356 CS域和PS域的区别: 1.基 ...

  5. java运行原理剖析

    java是一种编译型语言,我们开发好的代码是不能够直接运行的,需要我们程序员进行编译之后,将字节点文件载入jvm虚拟之后,才可以运行操作 其原理是 java源代码-------编译-------> ...

  6. vs2015 引用lib库和dll

    1.首先右键项目->属性 2.在项目中添加lib文件夹,把lib库放在文件夹下面,然后在图中的库目录引用当前路径的lib文件夹 3.在项目的路径下添加include中添加头文件,然后在常规中添加 ...

  7. Splunk和ElasticSearch深度对比解析(转)

    转载自:http://www.sohu.com/a/154105465_354963 随着Splunk越来越被大家熟知和认可,现在市面上也不断涌各种同类产品,作为大数据搜索界的翘楚Splunk和Ela ...

  8. angularjs探秘<二>表达式、指令、数据绑定

    距离第一篇笔记好久了,抽空把angular的笔记梳理梳理. ng-init:初始化指令,这里可以声明变量,且变量不用指定数据类型(类似js中的var用法). 数值变量与字符串相加默认做字符串拼接运算. ...

  9. android 开发 使用自定义布局实现标题栏复用(标题栏内容自定义:使用代码实现和xml布局自定义属性2种办法实现)

    在个人学习的情况下可能很少使用自定义布局去实现大量复用的情况下,但是在一个开发工作的环境下就会使用到大量复用的自定义控件. 实现思维: 1.写一个xml的布局,用于标题栏的样式,并且添加在标题栏中你想 ...

  10. uva-10132-排序

    题意: 有很多文件,碎成了俩片,问,原来的文件是什么,如果有多个答案,任意一个答案就行,输入2N个字符串,拼接成N个文件. 直接排序,正确的答案一定是某个长度最短的和某个最长的连在一起. #inclu ...