题解 | #奶牛喂养时间#
奶牛喂养时间
https://www.nowcoder.com/practice/db2c7c52df0449b49b36e7fe5364f521
知识点
排序,合并区间
解题思路
首先,对给定的区间数组 intervals 进行排序,按照区间的起始时间进行升序排序。创建一个结果集合 merged,用于存储合并后的区间。初始化一个当前区间 currentInterval,将排序后第一个区间 intervals[0] 赋值给 currentInterval,并添加到 merged 中。
从第二个区间 intervals[1] 开始遍历剩余的区间:如果当前区间的结束时间 currentInterval[1] 大于等于下一个区间的起始时间 intervals[i][0],说明发生了重叠,需要合并区间。用当前区间的结束时间 currentInterval[1] 和下一个区间的结束时间 intervals[i][1] 中的较大值来更新 currentInterval 的结束时间。如果当前区间的结束时间 currentInterval[1] 小于下一个区间的起始时间 intervals[i][0],说明没有重叠,将下一个区间添加到 merged 中,并更新 currentInterval。
遍历完所有区间后,将 merged 转换成二维数组,返回合并后的区间列表。
Java题解
import java.util.*; public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param intervals int整型二维数组 * @return int整型二维数组 */ public int[][] mergeTimeIntervals (int[][] intervals) { // write code here // 按照区间的起始时间排序 Arrays.sort(intervals, (a, b) -> a[0] - b[0]); List<int[]> merged = new ArrayList<>(); int[] currentInterval = intervals[0]; merged.add(currentInterval); for (int i = 1; i < intervals.length; i++) { int[] interval = intervals[i]; // 如果当前区间的结束时间大于等于下一个区间的起始时间,发生重叠 if (currentInterval[1] >= interval[0]) { // 合并区间,更新结束时间 currentInterval[1] = Math.max(currentInterval[1], interval[1]); } else { // 不重叠,添加新的区间 currentInterval = interval; merged.add(currentInterval); } } // 转换成二维数组 int[][] result = new int[merged.size()][2]; for (int i = 0; i < merged.size(); i++) { result[i] = merged.get(i); } return result; } }