题目: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;
}
};