方法:排序
我们可以将区间按照左端点升序排列在遍历区间进行合并操作。当答案数组中最后一个区间的右端点小于我们所考虑的区间的左端点,说明两个区间不会重合。我们直接将当前区间加入数组末尾。否则,进行比较将答案数组的最右点放入二者的最大值。
代码如下:
class Solution {
public int[][] merge(int[][] intervals) {
Arrays.sort(intervals,(a,b) ->a[0] - b[0]);//也可使用【Arrays.sort(intervals,Comparator.comparingInt(o->o[0]));】
List<int []> ans = new ArrayList<>();
ans.add(intervals[0]);
for(int i = 1; i < intervals.length; ++i)
{
int s = intervals[i][0],e = intervals[i][1];
if(ans.get(ans.size()-1)[1]<s)
{
ans.add(intervals[i]);
}
else
{
ans.get(ans.size()-1)[1] = Math.max(ans.get(ans.size()-1)[1],e);
}
}
return ans.toArray(new int[ans.size()][]);
}
}
简单易懂版:
class Solution {
public int[][] merge(int[][] intervals) {
Arrays.sort(intervals,(a,b) -> a[0] - b[0]);
List<int[]>res = new ArrayList<>();
for(int i = 1; i < intervals.length;i++)
{
if(intervals[i][0] <= intervals[i-1][1])
{
intervals[i]=new int[]
{
intervals[i-1][0],Math.max(intervals[i-1][1], intervals[i][1])
};
}
else
{
res.add(intervals[i-1]);
}
}
res.add(intervals[intervals.length-1]);
int[][] arr = new int[res.size()][];
for(int i = 0; i < res.size(); i++)
arr[i] = res.get(i);
return arr;
}
}
补充相关知识
lambada表达式也可称为闭包,它是Java 8 发布的最重要新特性。
语法:(parameters) -> expression 或 (parameters) ->{ statements; }
1、paramaters:类似方法中的形参列表,这里的参数是函数式接口里的参数。这里的参数类型可以明确的声明,也可不声明而由JVM隐含的推断。另外当只有一个推断类型时可以省略掉圆括号
2、->:可理解为“被用于”的意思
3、方法体:可以是表达式也可以代码块,是函数式接口里方法的实现。代码块可返回一个值或者什么都不返回,这里的代码块块等同于方法的方法体。如果是表达式,也可以返回一个值或者什么都不返回
闭包的意思:
闭包就是将一些行为封装,把它当作一个对象一样传来传去,并且它依就可以访问到原来第一次声明时的上下文。
闭包是一个可调用的对象,它记录了一些信息,这些信息来自于创建它的作用域。
toArray()
这种方式将会把集合中的元素复制到一个Object类型的数组中,并返回该数组。
数组类型的定义不能使用基本类型,因为ArrayList里面只能放引用类型,不能放基本类型,如int[ 0] 就会报错(我们可以使用Integer[ 0 ]).但是可以返回int [ ] [ ] ,因为Java中的二维数组int [ ] [ ]可以看成存放在int [ ] 的数组,而int [ ] 是引用类型