文章目录
- 一、核心解题思路(贪心算法)
- 二、完整可运行代码(大厂机考版)
- 三、关键方法 / 语法讲解
- 1. Arrays.sort(intervals, (a, b) -> a[0] - b[0]);
- 2. List<int[]> ans = new ArrayList<>();
- 3. ans.add(new int[]{start, end});
- 4. int[][] res = new int[ans.size()][2];
- 5. ans.toArray(res);
- 6. Math.max(end, intervals[i][1]);
力扣地址: 中等:56. 合并区间
挺简单的
一、核心解题思路(贪心算法)
先排序
把所有区间按起点从小到大排序,只有排好序才能从左到右依次合并。逐个合并
用
start和end记录当前正在合并的区间遍历下一个区间:
- 如果下一个区间起点 > 当前 end→ 不重叠,保存当前区间,重置 start、end
- 否则 → 重叠,更新 end 为两者最大值
收尾
循环结束后,把最后一个合并好的区间加进去。
返回结果
将 List 转成二维数组返回。
classSolution{publicint[][]merge(int[][]intervals){Arrays.sort(intervals,(a,b)->a[0]-b[0]);List<int[]>res=newArrayList<>();intstart=intervals[0][0];intend=intervals[0][1];for(inti=1;i<intervals.length;i++){if(intervals[i][0]>end){res.add(newint[]{start,end});start=intervals[i][0];end=intervals[i][1];}else{end=Math.max(end,intervals[i][1]);}}res.add(newint[]{start,end});returnres.toArray(newint[res.size()][]);}}二、完整可运行代码(大厂机考版)
importjava.util.ArrayList;importjava.util.Arrays;importjava.util.List;importjava.util.Scanner;publicclassMain{publicstaticint[][]merge(int[][]intervals){// 2. 按区间起点升序排序(对应 C++ 的 sort(intervals.begin(), intervals.end()))Arrays.sort(intervals,(a,b)->a[0]-b[0]);List<int[]>ans=newArrayList<>();// 3. 初始化第一个区间的起点和终点intstart=intervals[0][0];intend=intervals[0][1];// 4. 从第二个区间开始遍历for(inti=1;i<intervals.length;i++){// 5. 当前区间起点 > 已合并区间终点 → 无重叠,存入结果,重置区间if(intervals[i][0]>end){ans.add(newint[]{start,end});start=intervals[i][0];end=intervals[i][1];}else{// 6. 有重叠 → 合并,更新终点为两者最大值end=Math.max(end,intervals[i][1]);}}// 7. 循环结束,把最后一个合并好的区间加入结果ans.add(newint[]{start,end});// 8. List 转二维数组返回(Java 要求返回 int[][])returnans.toArray(newint[ans.size()][]);}publicstaticvoidmain(String[]args){Scannersc=newScanner(System.in);// 先输入区间个数intn=sc.nextInt();// 声明 n 行 2 列的二维数组int[][]intervals=newint[n][2];// 输入每个区间for(inti=0;i<n;i++){intervals[i][0]=sc.nextInt();intervals[i][1]=sc.nextInt();}// 调用合并方法int[][]res=merge(intervals);// 输出结果for(int[]arr:res){System.out.println(arr[0]+" "+arr[1]);}}}三、关键方法 / 语法讲解
1. Arrays.sort(intervals, (a, b) -> a[0] - b[0]);
- 作用:对二维数组按每个区间的第一个数从小到大排序
a、b代表两个一维数组(两个区间)a[0] - b[0]表示升序
2. List<int[]> ans = new ArrayList<>();
List<int[]>:存放多个一维数组(每个元素是一个区间)- 动态长度,方便添加元素
3. ans.add(new int[]{start, end});
- 向列表中添加一个新的区间数组
4. int[][] res = new int[ans.size()][2];
- 声明一个二维数组
- 行数:
ans.size()(合并后有多少个区间) - 列数:
2(每个区间固定起点、终点)
5. ans.toArray(res);
- 将 List 里的内容填入已创建的二维数组
- 最终返回
int[][]类型
6. Math.max(end, intervals[i][1]);
- 取两个数中较大的一个,用于合并区间时更新右端点