线扫描求解
Given an array of meeting time intervals consisting of start and end times [[s1,e1],[s2,e2],...] (si < ei)
, determine if a person could attend all meetings.
Example
Given intervals = [[0,30],[5,10],[15,20]]
, return false
.
/**
* Definition of Interval:
* public classs Interval {
* int start, end;
* Interval(int start, int end) {
* this.start = start;
* this.end = end;
* }
* }
*/
class Point {
int time;
int flag;
public Point(int time, int flag) {
this.time = time;
this.flag = flag;
}
}
public class Solution {
/**
* @param intervals: an array of meeting time intervals
* @return: if a person could attend all meetings
*/
public boolean canAttendMeetings(List<Interval> intervals) {
// Write your code here
if (intervals == null || intervals.size() == 0) {
return true;
}
Comparator<Point> cmp = new Comparator<Point>() {
public int compare(Point p1, Point p2) {
if (p1.time == p2.time) {
return p1.flag - p2.flag;
}
return p1.time - p2.time;
}
};
List<Point> list = new ArrayList<>();
for (int i = 0; i < intervals.size(); i++) {
Interval val = intervals.get(i);
list.add(new Point(val.start, 1));
list.add(new Point(val.end, 0));
}
Collections.sort(list, cmp);
int count = 0;
for (int i = 0; i < list.size(); i++) {
if (list.get(i).flag == 1) {
count++;
} else {
count--;
}
if (count > 1) {
return false;
}
}
return true;
}
}