我有三段时间:
上午10:00-11:00
上午11:00-11:30
下午3:00-3:30
我编写这个算法是为了递归地压缩和合并间隔(如果它们重叠或共享端点)。
public boolean optimizeIntervals(ArrayList<Interval> list) {
ArrayList<Interval> listToOptimize = list;
ArrayList<Interval> optimizedList = new ArrayList<Interval>();
for (int i = 1; i < listToOptimize.size(); i++) {
if (listToOptimize.get(i).getStart().equals(listToOptimize.get(i - 1).getEnd())) {
optimizedList.add(new Interval(listToOptimize.get(i - 1).getStart(), listToOptimize.get(i).getEnd()));
}else{
optimizedList.add(new Interval(listToOptimize.get(i).getStart(), listToOptimize.get(i).getEnd()));
}
}
if(optimizedList.size() == listToOptimize.size()){
setMeetingDuringIntervals(optimizedList);
return true;
}else{
optimizeIntervals(optimizedList);
}
return false;
}
但是,在使用调试器执行stacktrace之后,我注意到当第一个递归调用之后列表的大小小于cc>时,我将丢失最后一个3:00pm-3:30pm的
2
。如何重写该算法以避免丢失最终值?\
我的意思是:
运行1
连接间隔1和2
创建上午10:00-11:30
下午3:00-3:30不要
递归调用
检查3:00-3:30是否与间隔1有重叠?
不
仅添加下午3:00-3:30
我的代码逻辑:
如果
Interval
'si
匹配start time
'si-1
。将它们添加到优化列表中。如果不是,
只需将
end time
添加到优化列表中。然而,在当前的解决方案中,算法会在第二次运行时出错,从
i
开始,只添加3:00-3:30 pm,而不是第一次间隔? 最佳答案
所以我用这个算法解决了我的问题:
public boolean optimizeIntervals(ArrayList<Interval> list) {
ArrayList<Interval> listToOptimize = list;
ArrayList<Interval> optimizedList = new ArrayList<Interval>();
for (int i = 1; i < listToOptimize.size(); i++) {
if(listToOptimize.size()==2){
if (listToOptimize.get(i).getStart().equals(listToOptimize.get(i - 1).getEnd())) {
optimizedList.add(new Interval(listToOptimize.get(i - 1).getStart(), listToOptimize.get(i).getEnd()));
}else if(listToOptimize.get(i).getStart().isAfter(listToOptimize.get(i-1).getEnd())){
optimizedList.add(new Interval(listToOptimize.get(i).getStart(), listToOptimize.get(i).getEnd()));
optimizedList.add(new Interval(listToOptimize.get(i-1).getStart(), listToOptimize.get(i-1).getEnd()));
}
}
else{
if (listToOptimize.get(i).getStart().equals(listToOptimize.get(i - 1).getEnd())) {
optimizedList.add(new Interval(listToOptimize.get(i - 1).getStart(), listToOptimize.get(i).getEnd()));
} else if (listToOptimize.get(i).getStart().isAfter(listToOptimize.get(i - 1).getEnd())) {
optimizedList.add(new Interval(listToOptimize.get(i).getStart(), listToOptimize.get(i).getEnd()));
}
}
}
if(optimizedList.size() == listToOptimize.size()){
setMeetingDuringIntervals(optimizedList);
return true;
}else{
optimizeIntervals(optimizedList);
}
return false;
}
如果有一个最终连接(意味着列表大小为2),则处理该案例;
我不知道是否有更好的方法来处理这个问题,但它是有效的。