lintcode-----meeting roomII

题目描述:
Given an array of meeting time intervals consisting of start and end times [[s1,e1],[s2,e2],…] (si < ei), find the minimum number of conference rooms required.

样例:
Given intervals = [(0,30),(5,10),(15,20)], return 2.

思路讲解:这个就是看时间间隔重复的有多少,然后重复的不能共用一个会议室,所以我们只需要看重复最大的数是多少,故我们这个就是找出最大的重复数。首先建立一个数组来模拟时间轴,某个时间会议开始就将该处的值加1,在某个时间点会议结束就将该处的值置为-1.这样我们求重复的最大个数,就是求数组某一段的和最大即1的个数最多也即会议时间重复的个数,这样就将问题简化的很简单了。
代码详解:

/**
 * Definition of Interval:
 * classs Interval {
 *     int start, end;
 *     Interval(int start, int end) {
 *         this->start = start;
 *         this->end = end;
 *     }
 * }
 */

class Solution {
public:
    /**
     * @param intervals: an array of meeting time intervals
     * @return: the minimum number of conference rooms required
     */
    int minMeetingRooms(vector<Interval> &intervals) {
        // Write your code here
        int len=intervals.size();
        int max=0;
        for(int i=0;i<len;i++){//找出最大的数,即时间最晚结束的时间
            if(intervals[i].end>max){
                max=intervals[i].end;
            }
        }
        int *p=new int[max+1];//建立时间轴
        for(int i=0;i<=max;i++){
            p[i]=0;
        }
        for(int i=0;i<len;i++){
            p[intervals[i].start]=p[intervals[i].start]+1;
            p[intervals[i].end]=p[intervals[i].end]-1;
        }

        //printvector(p,max+1);
        int sum=0;
        int res=INT_MIN;;
        for(int i=0;i<=max;i++){//找出最大的重复数
            sum=sum+p[i];
            if(res<sum){
                res=sum;
            }
        }

        return res;

    }
    void printvector(int *p,int m){
        for(int i=0;i<m;i++){
            cout<<p[i]<<" ";
        }
        cout<<endl;
    }
};

猜你喜欢

转载自blog.csdn.net/qq_34355232/article/details/79656863
今日推荐