LeetCode 第 36 场双周赛

1.设计停车系统

做法:

按照题意模拟。

代码:

class ParkingSystem {
public:
    ParkingSystem(int big, int medium, int small) {
        this->big = big;
        this->medium = medium;
        this->small = small;
    }
    
    bool addCar(int carType) {
        if(carType == 1){
            if(this->big > 0){
                this->big--;
                return true;
            }
        }
        else if(carType == 2){
            if(this->medium > 0){
                this->medium--;
                return true;
            }            
        }
        else if(carType == 3){
            if(this->small > 0){
                this->small--;
                return true;
            }
        }
        return false;
    }
private:
    int big, medium, small;
};

2. 警告一小时内使用相同员工卡大于等于三次的人

做法:

统计每个人的“打卡时间”,没有跨天的情况。对时间排个序,就能快速的判断是否是否有3个“打卡时间”小于1个小时。

class Solution {
public:
    map<string, vector<string>>mp;
    vector<string>ans;
    vector<string> alertNames(vector<string>& keyName, vector<string>& keyTime) {
        int num = keyName.size();
        mp.clear();
        ans.clear();
        for(int i = 0; i < num; i++){
            string name = keyName[i];
            string time = keyTime[i];
            mp[name].push_back(time);
        }
        for(map<string, vector<string>>::iterator it = mp.begin();it!=mp.end();it++){
            vector<string>tmp = it->second;
            string name = it->first;
            sort(tmp.begin(), tmp.end());
            for(int i = 2; i < tmp.size(); i++){
                int t1 = fun(tmp[i]), t2 = fun(tmp[i-2]);
                if(t1-t2<=60){
                    ans.push_back(name);
                    break;
                }
            }
        }
        sort(ans.begin(), ans.end());
        return ans;
    }
    int fun(string time){
        int hour = (time[0]-'0')*10+(time[1]-'0');
        int mins = (time[3] - '0')*10+(time[4]-'0');
        return hour*60+mins;
    }
};

3.给定行和列的和求可行矩阵

做法:

对一个矩形的左上角的点a(0,0)=min(row[0], col[0]),如果取到了的是行,那那一行其他格子可以是0。如果取到的是列,那那一列其他格子可以是0。基于这样的操作,每次可以将一个矩形的第一行,或者第一列去掉,变成一个子问题。

代码

class Solution {
public:
    
    vector<vector<int>> restoreMatrix(vector<int>& rowSum, vector<int>& colSum) {
        int n = rowSum.size(), m = colSum.size();
        vector<vector<int>> ans(n, vector<int>(m,-1));
        for(int i = 0;i<n;i++){
            for(int j=0;j<m;j++){
                if(ans[i][j]==-1){
                    if(rowSum[i]<colSum[j]){
                        ans[i][j]=rowSum[i];
                        for(int k=j+1;k<m;k++){
                            if(ans[i][k]==-1){
                                ans[i][k]=0;
                            }
                        }
                        colSum[j]-=rowSum[i];
                        rowSum[i] = 0;
                    }
                    else{
                        ans[i][j]=colSum[j];
                        for(int k=i+1;k<n;k++){
                            ans[k][j]=0;
                        }
                        rowSum[i] -= colSum[j];
                        colSum[j]=0;
                    }
                }
            }
        }
        return ans;
    }
};

4.找到处理最多请求的服务器

做法

其实就是按照题意来做,为了效率,需要用一个数据结构支持以下操作:
1.对于x,找到大于等于x的数。
2.对于x,找到所有小于等于x的数。
这里选择C++中的set来做这个数据结构。
可用服务器的选择过程相当于操作1。运行服务器变成可用服务器的过程相当于操作2。

代码

class Solution {
public:
    set<pair<int,int>> endtime;
    set<int> now;
    int count[100005];
    vector<int>ans;
    vector<int> busiestServers(int k, vector<int>& arrival, vector<int>& load) {
        endtime.clear();
        now.clear();
        ans.clear();
        for(int i=0;i<k;i++){
            now.insert(i);
            count[i]=0;
        }
        int n=arrival.size();
        for(int i=0;i<n;i++){
            int time_now=arrival[i];
            while(1){
                if(endtime.empty()) break;
                set<pair<int,int>>::iterator it = endtime.begin();
                pair<int,int> tmp = *it;
                if(time_now>=tmp.first){
                    endtime.erase(it);
                    now.insert(tmp.second);
                }
                else{
                    break;
                }
            }
            if(now.empty()) continue;
            set<int>::iterator it = now.lower_bound(i%k);
            if(it == now.end()){
                it = now.begin();
            }
            int tmp = *it;
            now.erase(it);
            count[tmp]++;
            endtime.insert(make_pair(time_now+load[i],tmp));
        }
        int maxx=0;
        for(int i=0;i<k;i++){
            maxx=max(maxx,count[i]);
        }
        for(int i=0;i<k;i++){
            if(count[i]==maxx){
                ans.push_back(i);
            }
        }
        return ans;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值