leetcode2332:坐上公交车的最晚时间
题目:
给你一个下标从 0 开始长度为 n
的整数数组 buses
,其中 buses[i]
表示第 i
辆公交车的出发时间。同时给你一个下标从 0 开始长度为 m
的整数数组 passengers
,其中 passengers[j]
表示第 j
位乘客的到达时间。所有公交车出发的时间互不相同,所有乘客到达的时间也互不相同。
给你一个整数 capacity
,表示每辆公交车 最多 能容纳的乘客数目。
每位乘客都会搭乘下一辆有座位的公交车。如果你在 y
时刻到达,公交在 x
时刻出发,满足 y <= x
且公交没有满,那么你可以搭乘这一辆公交。最早 到达的乘客优先上车。
返回你可以搭乘公交车的最晚到达公交站时间。你 不能 跟别的乘客同时刻到达。
注意:数组 buses
和 passengers
不一定是有序的。
思路:
1.题目要求的解与乘客在数组中的顺序,公交车在数组中的顺序无关,故先对两个数组进行排序。
sort(buses.begin(),buses.end());//排序
sort(passengers.begin(),passengers.end());//排序
2.初始化两个指针:bus(表示排序后数组中的第n辆公交车);pas(表示排序后数组中第m个乘客);变量cap用于记录当前公交车所剩座位数,late用于记录最迟可上车时间。
bus=0;
pas=0;
cap=capacity;
late=0;
3.通过while循环,使得bus,pas指针移动过程中,不断更新late的值:
while(cap>0 && pas<passengers.size() && bus<buses.size())
buses[bus]与passengers[pas]的大小关系会将情况分为三种。
1):当前乘客到来时间<当前公交车发车时间
if(passengers[pas]<buses[bus]){
if(pas!=0 && passengers[pas-1]!=passengers[pas]-1){
//当前不是第一位乘客,且前一位乘客达到的时间小于passengers[pas]-1,更新late
late=passengers[pas]-1;
}
if(pas==0){//当前是第1位乘客,late的值更新
late=passengers[pas]-1;
}
pas++;//指向下一位乘客
cap--;//当前车容量减小
if(cap==0){//若当前车满员
bus++;//下一辆车
cap=capacity;
continue;
}
}
2):当前乘客到来时间=当前公交车发车时间。
与上面情况的区别:由于所有乘客到来时间不相同,所以无论当前车子cap是否为0,下一位乘客的时间都必然大于当前车子时间,故直接进行bus++。
else if(passengers[pas]==buses[bus]){
if(pas!=0 && passengers[pas-1]!=passengers[pas]-1){
late=passengers[pas]-1;
}
if(pas==0){
late=passengers[pas]-1;
}
pas++;//指向下一位乘客
bus++;//指向下一辆车
cap=capacity;
continue;
}
3):当前乘客到来时间>当前公交车发车时间。
由于cap>0,所以该班公交车还有剩余座位,故直接将late的值赋为当前公交车发车时间,bus++。
else{
if(late<buses[bus]){
late=buses[bus];
}
bus++;//指向下一辆车
cap=capacity;
}
4.While循环结束,可能是乘客指针超值了,也可能是公交车指针超值了。
1):公交车指针超值:由于所有公交车都已开走,故直接返回late值。
if(bus==buses.size()){//所有公车都没了
return late;
}
2): 乘客指针超值:还有公交车未坐满,而乘客已经没了,直接将late的值赋为最迟出发的公交车的时间即可。
if(pas==passengers.size()){//乘客没了,车还有
if(passengers[pas-1]<buses[buses.size()-1]){
late=buses[buses.size()-1];
}
}
完整可执行代码:
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
class Solution {
public:
int latestTimeCatchTheBus(vector<int>& buses, vector<int>& passengers, int capacity) {
sort(buses.begin(),buses.end());//排序
sort(passengers.begin(),passengers.end());//排序
int bus=0;
int pas=0;
int cap=capacity;
int late=0;
while(cap>0 && pas<passengers.size() && bus<buses.size()){
if(passengers[pas]<buses[bus]){
if(pas!=0 && passengers[pas-1]!=passengers[pas]-1){
late=passengers[pas]-1;
}
if(pas==0 ){
late=passengers[pas]-1;
}
pas++;//乘客指针
cap--;//车容量减小
if(cap==0){//该车满
bus++;//下一辆车
cap=capacity;
continue;
}
}
else if(passengers[pas]==buses[bus]){
if(pas!=0 && passengers[pas-1]!=passengers[pas]-1){
late=passengers[pas]-1;
}
if(pas==0 ){
late=passengers[pas]-1;
}
pas++;
bus++;
cap=capacity;
continue;
}
else{
if(late<buses[bus]){
late=buses[bus];
}
bus++;
cap=capacity;
}
}
if(bus==buses.size()){//所有公车都没了
return late;
}
if(pas==passengers.size()){//乘客没了,车还有
if(passengers[pas-1]<buses[buses.size()-1]){
late=buses[buses.size()-1];
}
}
return late;
}
};
(第一次发博客,有不足的地方还望指出)