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 1:
Input:[[0,30],[5,10],[15,20]]
Output: falseExample 2:
Input: [[7,10],[2,4]] Output: true
NOTE: input types have been changed on April 15, 2019. Please reset to default code definition to get new method signature.
会议室。给的input是一个二维数组,二维数组里面的每一个元素记录了每个会议的开始时间和结束时间。问同一个人是否有可能参加所有的会议。思路很简单,但是这是LC上算是一种比较特别的题型 - 扫描线。这题的思路是按照会议开始时间给input排序,如果有任何一个会议的结束时间 > 下一个会议的开始时间,就return false。
时间O(nlogn)
空间O(1)
JavaScript实现
1 /** 2 * @param {number[][]} intervals 3 * @return {boolean} 4 */ 5 var canAttendMeetings = function(intervals) { 6 let sorted = intervals.sort((a, b) => a[0] - b[0]); 7 for (let i = 1; i < intervals.length; i++) { 8 if (sorted[i - 1][1] > sorted[i][0]) { 9 return false; 10 } 11 } 12 return true; 13 };
Java实现
Java的做法是按照会议结束时间排序,然后从第二个会议开始看,如果有任何一个会议的开始时间早于前一个会议的结束时间,则return false。思路跟JS的版本其实都是类似的,无非是实现方式稍有差异。
1 class Solution { 2 public boolean canAttendMeetings(int[][] intervals) { 3 Arrays.sort(intervals, (a, b) -> a[1] - b[1]); 4 for (int i = 1; i < intervals.length; i++) { 5 if (intervals[i][0] < intervals[i - 1][1]) { 6 return false; 7 } 8 } 9 return true; 10 } 11 }