LeetCode 2332. 坐上公交的最晚时间(模拟)

题目:2332. 坐上公交的最晚时间

在这里插入图片描述
在这里插入图片描述

思路:先对两个数组进行排序,然后模拟乘客上车的流程。直到处理完最后一辆公交。然后进行分类讨论,时间复杂度0(nlogn),细节看注释。

class Solution {
public:
    int latestTimeCatchTheBus(vector<int>& buses, vector<int>& passengers, int capacity) {
    	//排序
        sort(buses.begin(),buses.end());
        sort(passengers.begin(),passengers.end());
        //j模拟乘客
        int j=0;
        //res是记录返回值
        int res=0;
        //模拟所有公交载客
        for(int i=0;i<buses.size();i++){
        	//当前公交上的乘客数量
            int ans=0;
            //当还有乘客,且公交没满
            while(j<passengers.size()&&ans<capacity){
            	//如果乘客符合要求,就上车
                if(passengers[j]<=buses[i]){
                    ans++;
                    j++;
                }
                else break;
            }
            //如果处理完最后一辆大巴
            if(i==buses.size()-1){
            	//一个乘客都没有,直接复制公交的发出时间
                if(ans==0) res=buses[i];
                else if(ans==capacity){//公交载满乘客
                    j--;//--,是因为每次乘客上车后,要++
                    //因为载满乘客,那肯定要挤掉最后一个乘客啦,但是值不可重复
                    int tmp=passengers[j];//只能先赋值为最后一个乘客
                    while(j>=0){
                    	//如果当前乘客和tmp不同,那就可以直接退出
                        if(tmp!=passengers[j]) break;
                        else tmp--;
                        j--;
                    }
                    res=tmp;//赋值
                }else{//公交载有乘客,但没有满
                    j--;
                    因为没载满乘客,那肯定先赋值一个最大值。
                    int tmp=buses[i];
                    while(j>=0){
                        if(tmp!=passengers[j]) break;
                        else tmp--;
                        j--;
                    }
                    res=tmp;
                }
            }
        }
        return res;
    }
};

会发现代码有一部分是相同的,优化一下

class Solution {
public:
    int latestTimeCatchTheBus(vector<int>& buses, vector<int>& passengers, int capacity) {
        sort(buses.begin(),buses.end());
        sort(passengers.begin(),passengers.end());
        int j=0;
        int res=0;
        for(int i=0;i<buses.size();i++){
            int ans=0;
            while(j<passengers.size()&&ans<capacity){
                if(passengers[j]<=buses[i]){
                    ans++;
                    j++;
                }
                else break;
            }
            if(i==buses.size()-1){
                if(ans==0) res=buses[i];
                else{
                    j--;
                    int tmp;
                    //优化地方
                    tmp=(ans==capacity) ? passengers[j]:buses[i];
                    while(j>=0){
                        if(tmp!=passengers[j]) break;
                        else tmp--;
                        j--;
                    }
                    res=tmp;
                }
            }
        }
        return res;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值