【发布时间】:2017-07-24 22:17:40
【问题描述】:
以下是 Leetcode 中“会议室 2”的问题:
给定一个由开始和结束组成的会议时间间隔数组 次 [[s1,e1],[s2,e2],...] (si
例如,给定 [[0, 30],[5, 10],[15, 20]],返回 2。
众所周知,一种可能的解决方案是在比较相邻会议的开始和结束时间之前对区间数组进行排序。
public int minMeetingRooms(Interval[] intervals) {
Arrays.sort(intervals, new Comparator<Interval>() {
public int compare(Interval a, Interval b) {
return a.start - b.start;
}
});
List<Interval> list = new ArrayList<>(Arrays.asList(intervals));
int count = 0;
while (!list.isEmpty()) {
int end = list.remove(0).end; count++; // create new timeline
Iterator<Interval> ite = list.iterator();
while (ite.hasNext()) {
Interval next = ite.next();
if (next.start >= end) { // add to current timeline
end = next.end;
ite.remove();
}
}
}
return count;
}
但是假设我们有以下代码来检测两次会议之间的时间冲突,
private boolean isConflict(Interval a, Interval b) {
boolean abfb = (a.start < b.start && a.end <= b.start);
boolean aaftb = (b.start < a.start && b.end <= a.start);
return !(abfb || aaftb);
}
例如,我们有间隔:[[15,20],[12,14],[1,17],[0,30],[7,10],[5,10]]。以[15,20] 开头,
Room#1的时间表应该是:[[7,10],[12,14],[15,20]]
现在还是[[1,17],[0,30],[5,10]],他们都需要一个新房间,
Room#2 : [[1,17]],
Room#3 : [[0,30]],
Room#4 : [[5,10]],
所以我们总共需要4 个房间。
这是代码,
public int minMeetingRooms(Interval[] intervals) {
List<Interval> list = new LinkedList<>(Arrays.asList(intervals));
int count = 0;
while (!list.isEmpty()) {
List<Interval> group = new ArrayList<>();
group.add(list.remove(0)); count++;
Iterator<Interval> ite = list.iterator();
while (ite.hasNext()) {
Interval noGroup = ite.next();
boolean conflict = false;
for (Interval inGroup : group) {
if (isConflict(inGroup,noGroup)) { conflict = true; break; }
}
if (!conflict) {
group.add(noGroup);
ite.remove();
}
}
}
return count;
}
上面的代码通过了 71/77 的测试,但是在 72 号失败了。如果我们不先对区间进行排序,任何人都可以说出它不起作用的原因吗?
【问题讨论】:
-
实际上您可以在
O(n)中执行此操作,而无需任何复杂的代码。是的,我们也不需要以这种方式进行排序。但是你需要O(max(start,end))空间。
标签: algorithm