题目
给你一个下标从 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 位乘客和你。
解题
方法一:
class Solution { public: int latestTimeCatchTheBus(vector<int>& buses, vector<int>& passengers, int capacity) { int m=buses.size(),n=passengers.size(),res=0,b=0,p=0; sort(buses.begin(),buses.end()); sort(passengers.begin(),passengers.end()); while(b<m){ int count=capacity; while(p<n){ if(count==0) break; if(passengers[p]<=buses[b]){ res=passengers[p]; p++; count--; }else break;//如果乘客比车晚到,那么剩下的乘客都没法乘坐这辆车 } if(count) res=buses[b];//如果还有座位,你可以在公交出发的时间到即可 b++; } unordered_set<int> set; for(int p:passengers) set.insert(p); while(set.count(res)!=0) res--;//如果这个时间点已经有乘客到达,你应该比他们更早 return res; } };