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