我有三段时间:
上午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),则处理该案例;
我不知道是否有更好的方法来处理这个问题,但它是有效的。

10-01 22:52
查看更多