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个范围,把重叠的范围合并,返回合并后的坐标对 思路: 先排序,再遍历判断下一个开始是否在上一个 ...
随机推荐
- Mybatis 系列7-结合源码解析核心CRUD 配置及用法
[Mybatis 系列10-结合源码解析mybatis 执行流程] [Mybatis 系列9-强大的动态sql 语句] [Mybatis 系列8-结合源码解析select.resultMap的用法] ...
- 00009 - cat、tail、head、tee、wc、sort文件操作和过滤
绝大多数命令行工作是针对文件的.我们会在本节中讨论如何观察及过滤文件内容,使用一条命令从文件中提取所需信息,以及对文件的内容进行排序. cat.tail.head.tee:文件打印命令这些命令的语法基 ...
- 查看hbase中的中文
python: print '\xE4\xB8\xAD\xE5\x9B\xBD\xE7\x9A\x84\xE4\xB8\x8A\xE5\x8D\x88'.decode('utf-8')
- 第2章 GNS3和PacketTracer网络模拟器(2)_搭建GNS3实验环境
2. GNS3实验环境 2.1 教学实验1:配置路由器和VPCS (1)配置VPCS虚拟电脑的IP地址命令 //配置VPCS电脑的IP地址等信息 PC1> ? //查看可用的命令 PC1> ...
- Android之socket多线程(二)
使用ServerSocket创建服务器端: public static void main(String[] args) throws IOException { // TODO Auto-gener ...
- (转)先装VS后装IIS产生问题的解决办法
原文地址:http://www.cnblogs.com/mytechblog/articles/1897682.html 基于.net的web程序设计asp.net,我们就必须安装VS和IIS,但这二 ...
- RISC与CISCCPU构架
RISC 精简指令集 CISC复杂指令集 CISC架构的代表: x86, C51 RISC架构的代码:arm, mips,powerpc, avr, pic 指令集的区别 首先从字面上理解就能知道, ...
- 互斥锁,IPC队列
进程同步(锁) 进程之间数据不共享,但是共享同一套文件系统,所以访问同一个文件,或同一个打印终端,是没有问题的,part1:共享同一打印终端,发现会有多行内容打印到一行的现象(多个进程共享并抢占同一个 ...
- python+bs4+urllib
# -*- coding: utf-8 -*- # # # from bs4 import BeautifulSoup import urllib2 import sys reload(sys) sy ...
- JS中 == ,===, !=, !==的区别
一个等号是赋值操作,==先转换类型再比较,===先判断类型,如果不是同一类型直接为false. === 判断规则 如果类型不同,就[不相等] 如果两个都是数值,并且是同一个值,那么[相等]:(!例外 ...