解释下这段代码 private static List<Meeting> scheduleByCoverageRate(List<Meeting> meetings) { List<Meeting> sorted = meetings.stream() .sorted(Comparator.comparing(Meeting::getBeginTime) .thenComparing(Meeting::getCreateTime) .thenComparing(Meeting::getPost) ).collect(Collectors.toList()); int[] dp = new int[sorted.size()]; int[] interval_cache = new int[sorted.size()]; for(int i = 0; i < sorted.size(); i++){ Meeting current = sorted.get(i); interval_cache[i] = dp[i] = (int)((current.getEndTime().getTime() - current.getBeginTime().getTime()) / 1000); } for(int i = 1; i < sorted.size(); i++) { for(int j = 0; j < i; j++) { if(sorted.get(j).getEndTime().compareTo(sorted.get(i).getBeginTime()) <= 0) dp[i] = Math.max(dp[i], dp[j] + interval_cache[i]); } } int max_len = Arrays.stream(dp).max().orElse(-1); Assert.isTrue(max_len != -1, "size of argument is 0"); for(int i = sorted.size() - 1; i >= 0; i--) { sorted.get(i).setAllowed(dp[i] == max_len); if(dp[i] == max_len) max_len -= interval_cache[i]; } return sorted; }
时间: 2024-04-01 16:37:29 浏览: 135
这段代码是用来计算会议时间覆盖率的。首先,它会按照会议开始时间、创建时间和发布者进行排序,然后计算每个会议的持续时间,并将持续时间保存到数组interval_cache中。接着,它使用动态规划的思想,通过比较前一场会议与当前会议的结束时间,计算每个会议能够覆盖的时间长度,并将结果保存到数组dp中。最后,它通过遍历dp数组来判断每个会议是否可以被允许举行,并将结果保存到sorted列表中。具体实现中,从后向前遍历sorted列表,如果当前会议可以被允许举行,则将max_len减去该会议的持续时间。最终返回按照会议开始时间、创建时间和发布者排序后的会议列表。
相关问题
解释下这段代码 private static List<Meeting> scheduleByPosition(List<Meeting> meetings) { List<Meeting> sorted = meetings.stream() .sorted(Comparator.comparing(Meeting::getPost) .thenComparing(Meeting::getEndTime) .thenComparing(Meeting::getCreateTime) ).collect(Collectors.toList()); Meeting last = null; for(Meeting elem : sorted) { boolean status = last == null || last.getEndTime().compareTo(elem.getBeginTime()) < 0; if(status) last = elem; elem.setAllowed(status); } return sorted; }
这段代码是按照会议发布者、结束时间和创建时间进行排序,并根据前一场会议的结束时间判断当前会议是否可以被允许举行。具体实现中,它首先按照上述规则对会议列表进行排序,然后使用变量last来记录上一场会议,并且根据上一场会议的结束时间和当前会议的开始时间判断当前会议是否可以被允许举行。如果上一场会议的结束时间早于当前会议的开始时间,则允许当前会议举行;否则,不允许当前会议举行。最后返回按照上述规则排序后的会议列表。
阅读全文