题解 | #奶牛喂养时间#
奶牛喂养时间
https://www.nowcoder.com/practice/db2c7c52df0449b49b36e7fe5364f521
import java.util.*; public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param intervals int整型二维数组 * @return int整型二维数组 */ public int[][] mergeTimeIntervals (int[][] intervals) { // write code here if (intervals == null || intervals.length <= 1) { return intervals; } Arrays.sort(intervals, (a, b) -> a[0] - b[0]); List<int[]> merged = new ArrayList<>(); int[] currentInterval = intervals[0]; for (int i = 1; i < intervals.length; i++) { if (intervals[i][0] <= currentInterval[1]) { currentInterval[1] = Math.max(currentInterval[1], intervals[i][1]); } else { merged.add(currentInterval); currentInterval = intervals[i]; } } merged.add(currentInterval); return merged.toArray(new int[merged.size()][]); } }
Java 编程语言编写的。
该题考察的知识点包括:
- 数组排序
- 贪心算法
- 二维数组
代码的文字解释:
首先对输入的时间区间数组 intervals
进行排序,以确保相邻的区间能够更容易地合并。
创建 merged
,用于存储合并后的时间区间。
初始化 currentInterval
为排序后的第一个时间区间。随后,我们遍历排序后的数组,对于每个时间区间,分两种情况:
- 如果当前时间区间的开始时刻小于等于 currentInterval 的结束时刻,说明有重叠,我们更新 currentInterval 的结束时刻为当前时间区间的结束时刻和 currentInterval 的结束时刻的最大值。
- 如果当前时间区间的开始时刻大于 currentInterval 的结束时刻,说明没有重叠,我们将 currentInterval 添加到 merged 列表中,并将 currentInterval 更新为当前时间区间。
还需要将最后一个 currentInterval
添加到 merged
列表中,因为遍历完成后最后一个时间区间没有机会被添加。将 merged
列表转换为数组,并返回合并后的时间区间数组。