算法刷题day1

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;
        }
};

(第一次发博客,有不足的地方还望指出)