《蓝桥杯预备专题》每日算法_基础篇

52 阅读1分钟

问题描述

image.png

解题思路

  • 最开始我想用散列桶来解决这个题,但是排序那块使用起来不方便,最终采用了二维数组来实现
  • 我们根据左侧端点进行排序,如果当前区间右端点大于等于下一个区间的左端点,说明这两个区间可以合并
  • 我们还需要判断一下是否需要更新下一个区间的右边界【如果大于等于当前区间的右边界就不用更新】

image.png

  • 相邻两个区间分为以下几种情况:
    • 第二个区间被第一个区间完全包含
      • 左端点相同
      • 右端点相同
      • 左右端点都不相同
    • 第二个区间与第一个区间存在交集
      • 部分交集
      • 端点交集
    • 两个区间不存在交集

代码部分

import java.util.*;

public class Main{
    public static void main(String [] args){
        // 读数据
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int [][] arr = new int[n][2];
        for(int i = 0; i < n; i++){
            int l = sc.nextInt();
            int r = sc.nextInt();
            arr[i][0] = l;
            arr[i][1] = r;
        }
        
        // 保存结果
        int res = n;
        // 根据二维数组的第一个元素进行排序
        Arrays.sort(arr, (a, b) -> a[0] - b[0]);
        // 遍历
        for(int i = 0; i < n - 1; i++){
            if(arr[i][1] >= arr[i + 1][0]){
                res--;
                // 更新合并后的右边界
                arr[i + 1][1] = Math.max(arr[i][1], arr[i + 1][1]);
            }
        }
        // 输出
        System.out.println(res);
    }
}