区间端点(java)(贪心问题————区间问题)
deepseek给了一种超级简单的做法
我是真的想不到
贪心的思路是 局部最优——>全局最优
这种我是真的没有想到,这样的好处就是后面便利的时候可以通过foreach循环直接便利qu的子元素也就是对应的某一个区间,
将一个二维数组变成一维数组,每一个一维数组直接存储区间左右端点
取的时候很方便
int qu[][] = new int[n][2];
for (int i = 0; i <n ; i++) {
qu[i][0] =in.nextInt();
qu[i][1] = in.nextInt();
}
选取每一个区间的右端点 ,可以让一个端点尽可能多的出现在其他区间
先给区间排序,按照右端点从小到大给区间进行排序
lamada表达式:
按照右端点的升序排序
// 按照区间右端点从小到大排序区间左右端点
Arrays.sort(qu,(a,b)->{
return a[1]-b[1];
});
设置一个记录出现在多个区间的端点的变量
因为题目中出现了数据范围最小是10的-9次方
- Integer.MIN_VALUE 是 java.lang 包的 Integer 类中的一个常量,指定存储 Java 中任何整数变量的最小可能值。
- 实际值是:
-2^31 = -2147483648
分别用来记录点的个数
和点的大小
int count = 0;
int min =Integer.MIN_VALUE;
每次先取最小的右端点,然后直到后面的某一个区间的左端点比这个点大
就取这个无法覆盖的区间的右端点作为新的点
直到最后
然后每次进行判断
// 直接获取某个区间存储的两个值l和r
for(int [] q:qu){
// 判断每一个区间的左端点 当前这个点要大
if(q[0]>min){
// 赋值给右端点
min = q[1];
count++;
}
}
完整代码
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.Scanner;
/**
* @author zb
* date2025/3/25 21:24
*/
public class Main {
public static void main(String[] args) {
Scanner in =new Scanner(System.in);
int n = in.nextInt();
int qu[][] = new int[n][2];
for (int i = 0; i <n ; i++) {
qu[i][0] =in.nextInt();
qu[i][1] = in.nextInt();
}
Arrays.sort(qu,(a,b)->{
return a[1]-b[1];
});
int count = 0;
int min = Integer.MIN_VALUE;
for(int [] q:qu){
// 判断每一个区间的左端点 当前这个点要大
if(q[0]>min){
// 赋值给右端点
min = q[1];
count++;
}
}
System.out.println(count);
in.close();
}
}