给你一个下标从 0 开始长度为 n
的整数数组 buses
,其中 buses[i]
表示第 i
辆公交车的出发时间。同时给你一个下标从 0 开始长度为 m
的整数数组 passengers
,其中 passengers[j]
表示第 j
位乘客的到达时间。所有公交车出发的时间互不相同,所有乘客到达的时间也互不相同。
给你一个整数 capacity
,表示每辆公交车 最多 能容纳的乘客数目。
每位乘客都会搭乘下一辆有座位的公交车。如果你在 y
时刻到达,公交在 x
时刻出发,满足 y <= x
且公交没有满,那么你可以搭乘这一辆公交。最早 到达的乘客优先上车。
返回你可以搭乘公交车的最晚到达公交站时间。你 不能 跟别的乘客同时刻到达。
注意:数组 buses
和 passengers
不一定是有序的。
示例 1:
输入:buses = [10,20], passengers = [2,17,18,19], capacity = 2 输出:16 解释: 第 1 辆公交车载着第 1 位乘客。 第 2 辆公交车载着你和第 2 位乘客。 注意你不能跟其他乘客同一时间到达,所以你必须在第二位乘客之前到达。
示例 2:
输入:buses = [20,30,10], passengers = [19,13,26,4,25,11,21], capacity = 2 输出:20 解释: 第 1 辆公交车载着第 4 位乘客。 第 2 辆公交车载着第 6 位和第 2 位乘客。 第 3 辆公交车载着第 1 位乘客和你。
提示:
n == buses.length
m == passengers.length
1 <= n, m, capacity <= 105
2 <= buses[i], passengers[i] <= 109
buses
中的元素 互不相同 。passengers
中的元素 互不相同 。
C++ 暴力模拟,太菜了
class Solution {
private:
unordered_map<int,int> mp;
public:
int help(int start) {
int ans=0;
for(int k=start;k>=0;k--) {
if(mp[k]==0) {
ans=k;
break;
}
}
return ans;
}
int latestTimeCatchTheBus(vector<int>& b, vector<int>& p, int capacity) {
int res=0;
sort(b.begin(),b.end());
sort(p.begin(),p.end());
int n=b.size();
int m=p.size();
int i=0; // 车
int j=0; // 乘客
int num=0;
vector<int> vec(n,0);
while(i<n && j<m) {
while(j<m && p[j]<=b[i] && num<capacity) {
mp[p[j]]=1;
j++;
num++;
}
if(num==capacity) {
vec[i]=1; // 第i辆车坐满了
}
if(j==m) {
break; // 所有乘客都上车了
}
// 等待下一辆车,容量恢复,num清零
num=0;
i++;
}
if(j==m) {
if(i==n-1) { // 最后一辆车把乘客运走的
if(num<capacity) { //最后一辆车还有座位,从车子到达时刻往前推
res=help(b[n-1]);
} else { //最后一辆车已坐满,从最后一个乘客往前推
res=help(p[m-1]);
}
} else { // 后面还有车子来,所有乘客已上车,从最后一辆车子到达时刻往前推
res=help(b[n-1]);
}
} else { //说明第j个乘客没有上车,j-1肯定上车了
if(p[j]<=b[n-1]) { // 因为没有座位了,乘客j才上不了车的,从j-1往前推
res=help(p[j-1]);
} else { // 乘客j在最后一辆车子到达之后才来的
// 此时要看最后一辆车还有没有座位,有座位就从最后一辆车到达时刻往前推,没座位就从j-1往前推
if(vec[n-1]==1) { //最后一辆车没有座位了
res=help(p[j-1]);
} else { //最后一辆车有座位
res=help(b[n-1]);
}
}
}
return res;
}
};