本次我们介绍基础算法中的区间合并,我们会从下面几个角度来介绍:
我们这次的目的很简单:
区间合并的要求:
我们给出主要思想:
/*
1.首先我们以每个分区的左侧为标准进行排序,这样我们的每次区间合并只需要采用当前区间和下一个区间对比即可,此外我们的左侧不需要改变
2.右侧的情况分为三种:包裹,接触,不接触
分别对应着右侧边界为a.r,b.r以及两个区间都添加的情况
*/
我们直接给出代码:
package cn.itcast.jvm.t1.gen;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class merge_arr1 {
public static void main(String[] args) {
// 创建区间
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
List<Arr> list = new ArrayList<>();
for (int i = 0; i < n; i++) {
list.add(new Arr(scanner.nextInt(),scanner.nextInt()));
}
// 执行区间合并
List<Arr> merge = merge(list);
System.out.println(merge.size());
}
public static List<Arr> merge(List<Arr> list){
// 实现内部逻辑
// 更换排序方案并排序(以左边界大小排序)
list.sort((o1, o2) -> o1.x - o2.x);
// 制作一个新的返回值
List<Arr> ans = new ArrayList<>();
// 开始值(由于每个区间只需要与下一个对比,所以我们直接采用一个区间值来代表上一个区间)
int l = (int)-2e9, r = (int)-2e9;
// 开始判断(这里的i代表的是下一个区间)
for (Arr i:list) {
// 表示不连接(直接将自身加入)
if (r < i.x){
// 判断是不是开始值,不是就加入新区间
if (r != (int)-2e9) {
ans.add(new Arr(l, r));
}
// 把当前l,r变为后面的那个区间的值
l = i.x;
r = i.y;
}else {
// 相接壤的话就判断右端点应该是哪个区间的右端点,然后将该区间作为上一个区间与下一个区间对比
r = Math.max(r, i.y);
}
}
// 前面我们将所有区间能合并的全部合并,不能合并就将当前区间加入列表,并设置下一个区间的范围
// 这里我们加入最后一个区间(由于最后一个区间只是设定了值,但是没有下一个i了,所以我们需要手动添加)
ans.add(new Arr(l, r));
return ans;
}
}
// 我们采用一个类存储区间
class Arr{
// x左边界,y右边界
int x,y;
// 构造函数
Arr(int x,int y){
this.x = x;
this.y = y;
}
}
好的,关于基础算法篇的区间合并就介绍到这里,希望能为你带来帮助~