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