LeetCode第[56]题(Java):Merge Intervals
题目:合并区间
难度:Medium
题目内容:
Given a collection of intervals, merge all overlapping intervals.
翻译:
给定一个区间的集合,合并所有重叠的区间。
Example 1:
Input: [[1,3],[2,6],[8,10],[15,18]]
Output: [[1,6],[8,10],[15,18]]
Example 2:
Input: [[1,4],[4,5]]
Output: [[1,5]]
我的思路:因为可能是乱序的,不好逐个比较,所以需要排序
1、将List内的元素进行排序(利用比较器),然后从前往后比较 ;
2、当前的end和后一个的start,看是否需要合并
3、如果需要合并则当前的end等于它自己与后一个的end中取大的,然后将后一个remove()掉
我的代码:
class Solution {
public List<Interval> merge(List<Interval> intervals) {
Collections.sort(intervals, new MyComparator()); for (int i = 0; i < intervals.size() - 1; i++) {
if (intervals.get(i).end >= intervals.get(i+1).start) {
intervals.get(i).end = intervals.get(i).end > intervals.get(i+1).end ? intervals.get(i).end : intervals.get(i+1).end;
intervals.remove(i+1);
i--;
}
}
return intervals;
}
} class MyComparator implements Comparator<Interval> { public int compare(Interval one, Interval two) {
return one.start - two.start;
} }
我的复杂度:O(NlogN) 主要是排序的那里用了nlogn 剩下的只有n
编程过程中的问题:
1、忘记比较器怎么实现:
方法一:将List中的类实现Comparable<E>接口(本题的E就是Interval),并重写compareTo方法(一个传入对象) 用自己的值和传入对象的值做比较即可。
【比较规则:自己比传入对象大就返回零,等于就等于0,小于就小于0,所以一般直接 return 自己 - 传入对象】如下:
public int compareTo(Interval o) {
return start - o.start;
}
但是,本题的Interval是写死的不能在编辑中修改,但是不要急,还有另外一种办法:
方法二:自己写一个类实现Comparator<E>接口,并重写compare方法(两个传入对象)
【比较规则:与上面类似 一般直接 return 前面一个对象 - 后面一个对象】如下:
public int compare(Interval one, Interval two) {
return one.start - two.start;
}
扩展:那如果要比较两个属性呢,比如先比较名字,再比较年龄————代码如下
public int compare(Person one, Person two) {
int i = one.name.compareTo(two.name); //比较名字字符串
if (i == 0) { //如果名字一样,则继续比较年龄
return one.age - two.age;
} else { //首先比较名字,名字不一样,则返回比较结果
return i;
}
}
使用此方法需要在sort()方法中传入作为第二个参数,(所以一般可直接在sort方法里使用匿名类)如下:
Collections.sort(intervals, new Comparator<Interval>(){
@Override
public int compare(Interval interval1, Interval interval2){
return interval1.start - interval2.start;
}
});
2、发现需要合并后,是不能直接将end取后一个的end的,因为后一个的end也是有可能比当前的小的,比如【【1,6】,【3,5】】,所以需要判断一下end的大小;
3、因为是顺序向后循环的,List调用remove方法去掉后一个之后,i 会指向后一个继续进行循环,但是此时应该仍然指向自己,继续判断后一个是否需要合并,所以需要 i - -。
扩展:如果是从后往前循环的呢?需要 i ++?
此时删去了下标i - 1,然后 i -- ,i 移到 下标 i -1 , 而此时的下标 i -1 就是remove之前的 下标 i 所以不再需要做操作。
例如:下标 0,1,2 此时 i 等于2 ,将1remove(此时的下标2自动变为1),然后 i -- ,i还是指向原来的2的位置。
所以,当在循环中调用List的remove方法的时候,一定要考虑下标的变化,而调整指针 i 的值。
答案代码:
class Solution {
private class IntervalComparator implements Comparator<Interval> {
@Override
public int compare(Interval a, Interval b) {
return a.start < b.start ? -1 : a.start == b.start ? 0 : 1;
}
} public List<Interval> merge(List<Interval> intervals) {
Collections.sort(intervals, new IntervalComparator()); LinkedList<Interval> merged = new LinkedList<Interval>();
for (Interval interval : intervals) {
if (merged.isEmpty() || merged.getLast().end < interval.start) {
merged.add(interval);
}
else {
merged.getLast().end = Math.max(merged.getLast().end, interval.end);
}
} return merged;
}
}
答案思路:和我的思路是一样的,先排序然后从头到位判断是否需要合并,
不过他使用了队列,空间复杂度提高了,但是这样避免了remove方法带来的多余的时间复杂度,二者各有好处。
LeetCode第[56]题(Java):Merge Intervals的更多相关文章
- 【LeetCode每天一题】Merge Intervals(合并区间)
Given a collection of intervals, merge all overlapping intervals. Example 1: Input: [[1,3],[2,6],[8, ...
- LeetCode第[18]题(Java):4Sum 标签:Array
题目难度:Medium 题目: Given an array S of n integers, are there elements a, b, c, and d in S such that a + ...
- LeetCode第[1]题(Java):Two Sum 标签:Array
题目: Given an array of integers, return indices of the two numbers such that they add up to a specifi ...
- LeetCode第[46]题(Java):Permutations(求所有全排列) 含扩展——第[47]题Permutations 2
题目:求所有全排列 难度:Medium 题目内容: Given a collection of distinct integers, return all possible permutations. ...
- LeetCode第[1]题(Java):Two Sum (俩数和为目标数的下标)——EASY
题目: Given an array of integers, return indices of the two numbers such that they add up to a specifi ...
- LeetCode解题报告—— Jump Game & Merge Intervals & Permutation Sequence
1. Jump Game Given an array of non-negative integers, you are initially positioned at the first inde ...
- LeetCode第[88]题(Java):Merge Sorted Array(合并已排序数组)
题目:合并已排序数组 难度:Easy 题目内容: Given two sorted integer arrays nums1 and nums2, merge nums2 into nums1 as ...
- 【Leetcode】【Hard】Merge Intervals
Given a collection of intervals, merge all overlapping intervals. For example,Given [1,3],[2,6],[8,1 ...
- LeetCode第[4]题(Java):Median of Two Sorted Arrays 标签:Array
题目难度:hard There are two sorted arrays nums1 and nums2 of size m and n respectively. Find the median ...
随机推荐
- zTree 树形控件 ajax动态加载数据
很久没搞过树形控件了 , 再次接触看官网文档有点没懂,于是在网上找了个代码copy上,但数据是写死的,就想这在用ajax异步取出数据替换,下面是js代码 <SCRIPT type="t ...
- C# 二进制文件操作(内容搜索、数据截取)
private void button2_Click(object sender, EventArgs e) { var list = new List<Frame>(); byte[] ...
- where case 使用
1 traceroleid表数据 tracerleid 表放着角色的相关信息, 角色ID 角色类型 密码 2 traceaccountmap表数据 表中存放着客户号和 其他角色的关系 tracerol ...
- centos7 Dockerfile安装nginx
1.写一个Dockerfile文件 FROM centos MAINTAINER apeng apeng@apenglinux-002.com RUN yum install -y pcre-deve ...
- Java HashMap工作原理及实现(转载)
https://yikun.github.io/2015/04/01/Java-HashMap工作原理及实现/
- 【我的Android进阶之旅】如何去除ListView中Header View、Footer View中的分割线
最近的项目中给ListView 加入了一个Header View之后,发现Header View的下方也有了分割线,很难看,UI要求将Header View的分割器去掉,好吧.现在就来说一说如何如何去 ...
- Vue(1)- es6的语法、vue的基本语法、vue应用示例,vue基础语法
一.es6的语法 1.let与var的区别 ES6 新增了let命令,用来声明变量.它的用法类似于var(ES5),但是所声明的变量,只在let命令所在的代码块内有效.如下代码: { let a = ...
- oradebug工具使用2(转载)
oradebug的前身是在ORACLE 7时的ORADBX,它可以启动用停止跟踪任何会话,dump SGA和其它内存结构,唤醒ORACLE进程,如SMON.PMON进程,也可以通过进程号使进程挂起和恢 ...
- 怎么找出解析失败的sql
本文由我和公司同事问心共同测试分析完成. 很多时候我们会有这样一个误区,语法错误或者对象不存在应该在语法语义检查这个步骤就结束了,怎么还会存在共享池里面呢?带着这个几个问题我们做几个简单的测试. 我们 ...
- PAT 天梯赛 L1-001 【水】
L1-001. Hello World 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 这道超级简单的题目没有任何输入. 你只需要在一行中输 ...