普通数组-56. 合并区间
文章目录一、核心解题思路贪心算法二、完整可运行代码大厂机考版三、关键方法 / 语法讲解1. Arrays.sort(intervals, (a, b) - a[0] - b[0]);2. Listint[] 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]);Listint[]resnewArrayList();intstartintervals[0][0];intendintervals[0][1];for(inti1;iintervals.length;i){if(intervals[i][0]end){res.add(newint[]{start,end});startintervals[i][0];endintervals[i][1];}else{endMath.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]);Listint[]ansnewArrayList();// 3. 初始化第一个区间的起点和终点intstartintervals[0][0];intendintervals[0][1];// 4. 从第二个区间开始遍历for(inti1;iintervals.length;i){// 5. 当前区间起点 已合并区间终点 → 无重叠存入结果重置区间if(intervals[i][0]end){ans.add(newint[]{start,end});startintervals[i][0];endintervals[i][1];}else{// 6. 有重叠 → 合并更新终点为两者最大值endMath.max(end,intervals[i][1]);}}// 7. 循环结束把最后一个合并好的区间加入结果ans.add(newint[]{start,end});// 8. List 转二维数组返回Java 要求返回 int[][]returnans.toArray(newint[ans.size()][]);}publicstaticvoidmain(String[]args){ScannerscnewScanner(System.in);// 先输入区间个数intnsc.nextInt();// 声明 n 行 2 列的二维数组int[][]intervalsnewint[n][2];// 输入每个区间for(inti0;in;i){intervals[i][0]sc.nextInt();intervals[i][1]sc.nextInt();}// 调用合并方法int[][]resmerge(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. Listint[] ans new ArrayList();Listint[]存放多个一维数组每个元素是一个区间动态长度方便添加元素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]);取两个数中较大的一个用于合并区间时更新右端点