一、问题描述
- 现有多个时间段如 :
beginTime: 2021-02-03 10:00:00 ,EndTime: 2021-02-03 12:00:00
beginTime: 2021-02-03 14:00:00 ,EndTime: 2021-02-03 16:00:00
beginTime: 2021-02-03 11:00:00 ,EndTime: 2021-02-03 13:00:00
beginTime: 2021-02-03 15:00:00 ,EndTime: 2021-02-03 17:00:00
beginTime: 2021-02-04 10:00:00 ,EndTime: 2021-02-04 12:00:00
beginTime: 2021-02-04 12:00:00 ,EndTime: 2021-02-04 14:00:00
beginTime: 2021-02-05 10:00:00 ,EndTime: 2021-02-05 12:00:00
beginTime: 2021-02-05 13:00:00 ,EndTime: 2021-02-05 15:00:00
或者多个数值区间:
begin: 3 end: 4
begin: 0 end: 3
begin: 1 end: 2
begin: 4 end: 5
begin: 2 end: 6
- 需要判断出有冲突的时间段 或 数值区间
【冲突】:
3-4 分别和 0-3,4-5,2-6有冲突,
0-3 分别和1-2,2-6有冲突
时间冲突类似数字 - 找到所有冲突的时间段or数字区间。
二、问题分析
-
暴力法(O(n²)) : 将开始数字和结束数字分别放入两个list里。双重for循环遍历beginList和 endList。如果当前时段的开始时间 大于 下一个时段的结束时间 或者 当前时段的结束时间 小于 下一个时段的开始时间,则没有冲突
-
优化解法(O(n)):
将开始数字和结束数字分别放入两个list,分别进行排序, 删除beginList的第一个数字。for循环遍历beginList,如果开始数字小于或等于结束数字,说明有冲突。
-
节省空间的优化解法(O(n))
将列表按照开始数字进行排序,遍历比较。结束数字>=下一个的开始数字,冲突
三、代码
- 新建一个实体,id,begin,end
import java.io.Serializable;
import java.util.Date;
/**
* @Description:
* @Author: juwei
* @Date: 2021/3/9 11:45
* @Version: 1.0
*/
public class TimeVo implements Serializable {
private Integer id<