示例 1:
输入: [[1,3],[2,6],[8,10],[15,18]]
输出: [[1,6],[8,10],[15,18]]
解释: 区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].
示例 2:
输入: [[1,4],[4,5]]
输出: [[1,5]]
解释: 区间 [1,4] 和 [4,5] 可被视为重叠区间。
解题思路:先根据每个区间的左端点对区间从小到大排序,然后从前往后比较前一个区间的右端点和后一个区间的左端点。合并的条件:前一个区间的右端点大于等于后一个区间的左端点。根据左端点来排序,根据右端点来合并
1、需要有个东西来存储输入的数据,所以先要定义一个这样的东西-就是该类中的一个方法。
2、主函数调用这个方法来存储这些输入的数据,然后再来对输入的数据进行相应的处理-也需要定义一个方法来处理
3、处理方法返回处理结果
思路:
1、排序
2、合并
/**
* Definition for an interval.
* public class Interval {
* int start;
* int end;
* Interval() { start = 0; end = 0; }
* Interval(int s, int e) { start = s; end = e; }
* }
*/
class Solution {
public List<Interval> merge(List<Interval> intervals) {
//需要有一个集合来存储合并后的区间
List<Interval> intervalsAfter = new ArrayList<>();
//根据集合中每个区间的左端点将每个区间排序
if(intervals.size()==0){
return intervalsAfter;
}
else{
//插入排序
// for(int i = 1;i < intervals.size();i++){
// int flag = 0;
// Interval temp = intervals.get(i);
// for(int j = 0;j < i&&flag == 0;j++){
// if(intervals.get(i).start < intervals.get(j).start){
// for(int k = i-1;k >= j;k--){
// intervals.set(k+1,intervals.get(k));
// }
// intervals.set(j,temp);
// flag = 1;
// }
// // if(intervals.get(j).start < intervals.get(i).start){
// // Interval temp = intervals.get(i);
// // intervals.set(i,intervals.get(j));
// // intervals.set(j,temp);
// // }
// }
// //至此得到了以start为顺序的区间集合
// }
for(int i = 0;i < intervals.size();i++){
for(int j = i+1;j < intervals.size();j++){
if(intervals.get(j).start < intervals.get(i).start){
Interval temp = intervals.get(i);
intervals.set(i,intervals.get(j));
intervals.set(j,temp);
}
}
//至此得到了以start为顺序的区间集合
}
//从第二个区间开始比较前一个区间的后端点和后一个区间的左端点。满足条件就合并,不满足条件就不合并
//需要有变量来存储合并后区间的前后端点
int starts = intervals.get(0).start;
int ends = intervals.get(0).end;
for(int i = 1;i < intervals.size();i++){
if(ends >= intervals.get(i).start){
ends = ends > intervals.get(i).end? ends:intervals.get(i).end;
}
else
{
intervalsAfter.add(new Interval(starts,ends));
starts = intervals.get(i).start;
ends = intervals.get(i).end;
}
}
intervalsAfter.add(new Interval(starts,ends));
}
return intervalsAfter;
}
}
方法二:
class Solution {
public List<Interval> merge(List<Interval> intervals) {
//定义一个存放合并后的区间
List<Interval> intervalsAfter = new ArrayList<>();
int n = intervals.size();
//定义左端点和右端点的两个数组来存储其中的数据
int[] start = new int[n];
int[] end = new int[n];
//将元素存入相应的数组中
for(int i = 0;i < n;i++){
start[i] = intervals.get(i).start;
end[i] = intervals.get(i).end;
}
//分别对两个数组排序
Arrays.sort(start);
Arrays.sort(end);
//合并区间得到最终的结果
for(int k = 0,h = 0;k < n;k++){
if(k == n-1||start[k+1] > end[k]){
intervalsAfter.add(new Interval(start[h],end[k]));
h = k+1;
}
}
return intervalsAfter;
}
}
真的只有学了数据结构和算法才能感受编程之美呀!!!