1. 程式人生 > 其它 >Leetcode 252. 會議室 253. 會議室II 貪心演算法-掃描線技巧

Leetcode 252. 會議室 253. 會議室II 貪心演算法-掃描線技巧

labuladong講解掃描線技巧

252.會議室

題目:

給定一個會議時間安排的陣列 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; } };

253.會議室 II

題目:

給你一個會議時間安排的陣列 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=