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和rfor(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();}}