2332. 坐上公交的最晚时间

2332. 坐上公交的最晚时间

给你一个下标从 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 位乘客和你。

解题代码如下,这题太复杂了,博主的代码可以解决问题,但是时间开销不能通过,感兴趣的,可以优化一下:


void quick(int *a,int low,int high){
    if(low<high){
        int p=a[low],l=low,h=high;
        while(low<high){
            while(low<high&&a[high]>=p){
                high--;
            }
            a[low]=a[high];
             while(low<high&&a[low]<=p){
               low++;
            }
            a[high]=a[low];
        }
        a[low]=p;
        quick(a,l,low-1);
        quick(a,low+1,h);
    }


}


int latestTimeCatchTheBus(int* buses, int busesSize, int* passengers, int passengersSize, int capacity){
    quick(buses,0,busesSize-1);
    quick(passengers,0,passengersSize-1);

    int p=0;
    int max=1;
    int queue[passengersSize];
    int rear=0,front=0;
    int size=0;
 
    
    for(int i=0;i<busesSize;i++){
        int target=buses[i];
         front=0;
          rear=0;
        //  printf("||");
          if(p<passengersSize){

         
            while(passengers[p]<=target&&rear-front<capacity){
           //     printf("%d ",passengers[p]);
                queue[rear++]=passengers[p++];
                if(p==passengersSize){
                    break;
                }
            }
         }
      
        if(rear-front<capacity){
            if(rear-front==0){
                max=target;
                continue;
            }
        //    printf("++");
          //  printf("%d ",queue[rear-1]);
            while(queue[rear-1]==target){
                rear--;
                target--;
             
                 if(front==rear){
                 break;
             }

            }
            int pz=p-1;
         
            while(target<passengers[pz]){
                  if(pz<=0){
                    break;
                }
                pz--;
               
              
               
            }
             while(target==passengers[pz]){
                   target--;
                  if(pz<=0){
                    break;
                }
                pz--;
              
                
                
               
            }
            printf("dfsa");
            max=target;
         }
         else{
             target=queue[rear-1];
            
           
             while(queue[rear-1]==target){
           
                rear--;
              
                target--;
                  if(front==rear){
                 break;
             }

            }
             int pz=p-1;
          
            while(target<passengers[pz]){
                  if(pz<=0){
                    break;
                }
                pz--;
               
              
               
            }
             while(target==passengers[pz]){
                   target--;
                  if(pz<=0){
                    break;
                }
                pz--;
              
                
                
               
            }
            max=target;

         }


    }
    return max;

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值