题解 | #奶牛喂养时间#
奶牛喂养时间
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 列表转换为数组,并返回合并后的时间区间数组。

