1. 判断区间是否重叠
题目
LeetCode252 给定一个会议时间安排的数组intervals,每个会议时间都包括开始和结束时间,intervals[i] = [start, endi],请你判断一个人是否能参加这里面的全部会议。
思路
遍历所有区间,判断下个区间开始是否小于上个区间结束,小于则合并,更新数组中该元素的结尾数字,
代码
/**
* 判断区间是否重叠
* @param intervals
* @return
*/
public boolean chongdie(int[][] intervals){
//将区间按照会议开始时间进行排序,升序
Arrays.sort(intervals);
//遍历,下一个会议开始时间在上一个会议结束时间之前
for (int i = 1; i < intervals.length; i++) {
if (intervals[i][0] < intervals[i - 1][1]){
return false;
}
}
return true;
}
2. 合并区间
题目
LeetCode56 以数组intervals表示若干个区间集合,其中单个区间为intervals[i] = [start,endi].请你合并所有重叠的区间,并返回一个不重叠的区间数组,该数组恰好覆盖输入中的所有区间。
思路
遍历所有区间,判断下个区间开始是否小于上个区间结束,小于则合并,更新数组中该元素的结尾数字,
代码
/**
* 合并相交的区间
* @param intervals
* @return
*/
public int[][] merage(int[][] intervals){
//按区间位置进行升序排序
Arrays.sort(intervals);
//创建新数组用于存储合并后的
int[][] res = new int[intervals.length][2];
int idx = -1;
for (int[] interval : intervals){
//先放进第一个数组,第二个区间起始位置 > 第一个区间终止位置,说明不重叠
if (idx == -1 || interval[0] > intervals[idx][1]){
res[++idx] = interval;
}else {
//重叠,合并区间
res[idx][1] = Math.max(res[idx][1], interval[1]);
}
}
//因为idx比数组元素个数小1,所以组要+1
return Arrays.copyOf(res, idx +1);
}
3. 插入区间
题目
LeetCode 57 给定一个区间的集合,找到与其相交的区间,其余的区间互补重叠。
思路
- 对于给定的newinterval,先找出左边与其相交的区间,起始时间小于上个区间的结束时间的区间。
- 然后右边终止元素大于下个区间起始时间的所有区间。
- 合并相交区间。
代码
public int[][] insert(int[][] intervals, int[] newInterval){
int[][] res = new int[intervals.length + 1][2];
int idx = 0;
//遍历区间先加入左边相离的区间
int i = 0;
while (i < intervals.length && intervals[i][1] < newInterval[0]){
res[idx++] = intervals[i++];
}
//判断终止时间,是否与右边区间重叠,重叠就合并
while (i < intervals.length && intervals[i][0] <= newInterval[1]){
newInterval[0] = Math.min(intervals[i][0],newInterval[0]);
newInterval[1] = Math.max(intervals[i][0], newInterval[1]);
i++;
}
res[idx++] = newInterval;
// 右边剩余区间加入结果集
while (i < intervals.length){
res[idx++] = intervals[i++];
}
return Arrays.copyOf(res,idx);
}