Leetcode 252. 會議室 253. 會議室II 貪心演算法-掃描線技巧
阿新 • • 發佈:2022-03-04
題目:
給定一個會議時間安排的陣列 intervals ,每個會議時間都會包括開始和結束的時間 intervals[i] = [starti, endi] ,請你判斷一個人是否能夠參加這裡面的全部會議。
示例 1:
輸入:intervals = [[0,30],[5,10],[15,20]]
輸出:false
示例 2:
輸入:intervals = [[7,10],[2,4]]
輸出:true
提示:
0 <= intervals.length <= 104
intervals[i].length == 2
0 <= starti <endi <= 106
思路:
求區間是否有重疊。可以將end按大小排序,然後比較後一個start是否大於前一個end
class Solution { public: bool canAttendMeetings(vector<vector<int>>& intervals) { sort(intervals.begin(),intervals.end(),[](vector<int>& a,vector<int>& b){ return a[1]<b[1]; });int n=intervals.size(); for(int i=1;i<n;++i){ if(intervals[i][0]<intervals[i-1][1]) return false; } return true; } };
題目:
給你一個會議時間安排的陣列 intervals ,每個會議時間都會包括開始和結束的時間 intervals[i] = [starti, endi] ,返回 所需會議室的最小數量 。
輸入:intervals = [[0,30],[5,10],[15,20]]
輸出:2
思路:
實際上求最大重疊數。這裡使用掃描線技巧。
把start和end分別排序。當遇到start時count++,當遇到end時count--。記錄過程中count的最大值。就是最大重疊數。
class Solution { public: int minMeetingRooms(vector<vector<int>>& intervals) { int n=intervals.size(); vector<int> start(n); vector<int> end(n); for(int i=0;i<n;++i){ start[i]=intervals[i][0]; end[i]=intervals[i][1]; } sort(start.begin(),start.end()); sort(end.begin(),end.end()); int i=0,j=0; int count=0; int ret=0; while(i<n&&j<n){ if(start[i]<end[j]){ count++; i++; }else{ count--; j++; } ret=max(ret,count); } return ret; } };聯絡方式:emhhbmdfbGlhbmcxOTkxQDEyNi5jb20=