给你一个下标从 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
中的元素 互不相同 。
可以想到的是贪心,尽量去做最后一辆车,那么可以定义一个idx,然后去遍历整个数组,尽量让每辆车都坐满capacity人,如果最后那辆坐不满capacity人,那么答案就是最后那辆车的发车时间
。做的满的话,idx就从后往前走,一直到能插进去上车即可
cpp
class Solution {
public:
int latestTimeCatchTheBus(vector<int>& buses, vector<int>& passengers, int capacity) {
int n = buses.size(),m = passengers.size();
sort(buses.begin(),buses.end());
sort(passengers.begin(),passengers.end());
// for(auto x : buses) cout << x << " ";
// cout << endl;
// for(auto x : passengers) cout << x << " ";
// cout << endl;
int idx = 0;
int c;
for(int i = 0;i < n;i ++){
int k = buses[i];
c = capacity;
for(int j = 0;j < m && idx < m && c;j ++){
if(passengers[idx] > k) break;
idx ++, c --;
}
}
idx --;
// cout << idx << " " << c << endl;
int res = (c ? buses[n - 1] : passengers[idx]);
// cout << res << endl;
while(idx >= 0 && res == passengers[idx]){
idx --,res --;
}
return res;
}
};
加油