一种是先Implements一个类,然后Arrays.sort(intervals, new newComparator);
public class newComparator implements Comparator<Object>{
public int compare(Object a, Object b) {
Interval aa = (Interval) a;
Interval bb = (Interval) b;
return aa.start - bb.start;
}
}
另一种是写在Arrays.sort()里面,实践证明这种更快
Arrays.sort(intervals, new Comparator<Interval>(){
//compare by start time
public int compare(Interval a, Interval b){
return a.start - b.start;
}
});
这题最简单的方法就是sort by start time,then check if(intervals[i].start < intervals[i-1].end) return false;
Meeting Rooms II
给定一堆meetings, 要求返回需要最少room的数量
sort intervals by start time
minHeap compare with end time
for loop intervals, if cur.startTime < minHeap.peek().endTime, then push cur to heap, cnt++ ->NlogK
res = max(cnt)
class Solution {
public int minMeetingRooms(int[][] intervals) {
//sort intervals by start time ->NlogN
//minHeap compare with end time
//for loop intervals, if cur.startTime < minHeap.peek().endTime, then push cur to heap, cnt++ ->NlogK
//res = max(cnt)
//Time: NlogN
//Space: O(K)
if (intervals == null || intervals.length == 0) return 0;
Arrays.sort(intervals, new Comparator<int[]>(){
@Override
public int compare(int[] a, int[] b) {
if (a[0] == b[0]) {
return a[1] - b[1];
}
return a[0] - b[0];
}
});
PriorityQueue<int[]> minHeap = new PriorityQueue<>(new Comparator<int[]>(){
@Override
public int compare(int[] a, int[] b) {
return a[1] - b[1];
}
});
int res = 0;
for (int i = 0; i < intervals.length; i++) {
if (minHeap.isEmpty() || minHeap.peek()[1] > intervals[i][0]) {
minHeap.offer(intervals[i]);
} else {
minHeap.poll();
minHeap.offer(intervals[i]);
}
res = Math.max(res, minHeap.size());
}
return res;
}
}
还有一种扫描线解法
Merge Interval
sort intervals by start time
iterate each interval, compare cur.startTime with prev.EndTime
if cur.startTime < end, then end = Math.max(end, cur.endTime)
else push [begin, end] to res
class Solution {
/*
sort intervals by start time
iterate each interval, compare cur.startTime with prev.EndTime
if cur.startTime < end, then end = Math.max(end, cur.endTime)
else push [begin, end] to res
*/
public int[][] merge(int[][] intervals) {
if (intervals == null || intervals.length == 0) {
return new int[0][0];
}
List<int[]> list = new ArrayList<>();
Arrays.sort(intervals, new Comparator<int[]>(){
@Override
public int compare(int[] a, int[] b) {
return a[0] - b[0];
}
});
int begin = intervals[0][0], end = intervals[0][1];
for (int i = 0; i < intervals.length; i++) {
if(intervals[i][0] <= end) {
end = Math.max(end, intervals[i][1]);
} else {
int[] interval = new int[2];
interval[0] = begin;
interval[1] = end;
list.add(interval);
begin = intervals[i][0];
end = intervals[i][1];
}
}
int[] interval = new int[2];
interval[0] = begin;
interval[1] = end;
list.add(interval);
int[][] res = new int[list.size()][2];
for (int i = 0; i < list.size(); i++) {
res[i][0] = list.get(i)[0];
res[i][1] = list.get(i)[1];
}
return res;
}
//05/05/21, while loop
public int[][] merge(int[][] intervals) {
//sort interval by start time in ascending order
//[start,end], while (end >= curStart) -> end = curEnd and move to next
Arrays.sort(intervals, new Comparator<int[]> () {
@Override
public int compare(int[] a, int[] b) {
return a[0] - b[0];
}
});
List<int[]> list = new ArrayList<>();
int i = 0;
while (i < intervals.length) {
int start = intervals[i][0], end = intervals[i][1];
int j = i+1;
while (j < intervals.length && end >= intervals[j][0]) {
end = Math.max(end, intervals[j][1]);
j++;
}
int[] interval = new int[2];
interval[0] = start;
interval[1] = end;
list.add(interval);
i = j;
}
int[][] res = new int[list.size()][2];
for (int k = 0; k < list.size(); k++) {
res[k] = list.get(k);
}
return res;
}
}