关于java LocalDateTime 在一个时间区间内分布n条数据,求最优的算法获取切分方式 摆脱o(n

public class test {

public static void main(String[] args) {


    List<Integer> numberOfCutters = Arrays.asList(5, 7, 10);

    LocalDateTime now = LocalDateTime.now();
    List<LocalDateTime> localDateTimes = Arrays.asList(
            addDateSeconds(now, 1),
            addDateSeconds(now, 2),
            addDateSeconds(now, 5),
            addDateSeconds(now, 10),
            addDateSeconds(now, 20),
            addDateSeconds(now, 22),
            addDateSeconds(now, 25),
            addDateSeconds(now, 26),
            addDateSeconds(now, 27),
            addDateSeconds(now, 28),
            addDateSeconds(now, 30),
            addDateSeconds(now, 33),
            addDateSeconds(now, 36),
            addDateSeconds(now, 40),
            addDateSeconds(now, 41),
            addDateSeconds(now, 42),
            addDateSeconds(now, 47),
            addDateSeconds(now, 50));

    System.out.println(segmentation(localDateTimes, numberOfCutters.get(2)));


    //期望获取这个时间段内 一共可以切分几刀  注:以10秒为例子 在时间列表中以第一条作为开始时间  往后推10秒 算是结束时间 算一刀;
    //第二刀的开始时间为第一刀结束时间内的最后一条数据的下一条数据 结束时间为往后的10秒
    //当十秒内只有一条数据也算一刀
    //最后一刀的开始时间到结束时间 如果超过列表的最后一条就舍弃  比如最后一刀 开始时间10点00分05秒 结束时间10点00分15秒
    // 而列表的最后一条为10:00:10那么这刀就舍弃

}

private static int segmentation(List<LocalDateTime> localDateTimes, Integer audioOften) {

    int count = 0;
    LocalDateTime end = localDateTimes.get(localDateTimes.size()-1);
    LocalDateTime startDate = localDateTimes.get(0);
    LocalDateTime endDate = addDateSeconds(localDateTimes.get(0), audioOften);
    while (startDate.isBefore(end)){
        LocalDateTime endDateTime = getsAllDatesInTheDateRange(localDateTimes,startDate,null!=endDate?endDate:addDateSeconds(startDate, audioOften));
        if(null!=endDateTime){
            startDate = endDateTime;
            endDate = null;
            count++;
        }else {
            startDate = end;
        }
    }
    return count;
}


/**
 * @param LocalDateTimeList
 * @param startDate
 * @param endDate
 * @return
 */
public static LocalDateTime getsAllDatesInTheDateRange(List<LocalDateTime> LocalDateTimeList, LocalDateTime startDate, LocalDateTime endDate) {
    List<LocalDateTime> localDateList = new ArrayList<>();
    // 开始时间必须小于结束时间
    if (startDate.isAfter(endDate)) {
        return null;
    }
    for (LocalDateTime localDateTime : LocalDateTimeList) {
        if (startDate.isAfter(localDateTime) || endDate.isBefore(localDateTime)) {
            localDateList.add(localDateTime);
        }
    }
    if (null != localDateList) {
        return localDateList.get(0);
    }
    return null;
}


/**
 * 日期秒增加
 */
public static LocalDateTime addDateSeconds(LocalDateTime date, int seconds) {
    return date.plusSeconds(seconds);
}

}