链接:https://leetcode.cn/problems/the-latest-time-to-catch-a-bus/solution/chun-c-by-xun-ge-v-pkz3/
来源:力扣(LeetCode)
题目
示例
思路
解题思路
题目要求我们赶上最后一班车,那么我们就不需要管最后一辆车之前的其他车什么情况,我们只要知道最后一班车来之前车站还有多少人在等车即可,然后根据这车能做多少人(capacity),选择一个位于capacity位到之前的一个合适的时间,关于这个合适的时间,存在以下几种情况
1、车站等最后一辆车的人数 < capacity,也就是说还有起码一个空位置,那么此时最晚到达时间就是车到的时间buses[busesSize-1]
2、车站等车的人 >= capacity,那么此时最晚到达的时间为车站等车人中第capacity之前一个
具体实现
题目条件是数组并没有升序,所以先将两个数组升序处理。
上述提到一个车站等车人数,那就申请一个数组空间保存车站等车人数,那我们申请一个多大的呢,当然是capacity,因为我们只需要最后一班车车站等人人数的前capacity,后面的人就算我不来,他们也上不去车。
遍历整个车数组,对所有车发车,当为最后一辆车时保存最后一辆车的情况
然后从数组中寻找合适的位置
题目还有一个条件,必须时间不同,当我们寻找最晚时间后,需要遍历这个时间之前的所有等车人,如果有重复的,我们就提前一分钟
代码
//快速排序
int cmp(const void * a, const void * b)
{
return *(int *)a - *(int *)b;
}
int latestTimeCatchTheBus(int* buses, int busesSize, int* passengers, int passengersSize, int capacity){
qsort(buses, busesSize,sizeof(buses[0]), cmp);
qsort(passengers, passengersSize, sizeof(passengers[0]), cmp);
int i = 0, j = 0;
int cap = 0;
int max = 0;
int m = 0;
int ans[capacity];//保存等车人数情况
for(i = 0; i < passengersSize && j < busesSize;)//遍历等车人
{
if(buses[j] >= passengers[i] && cap < capacity)//当前人可以上车
{
ans[cap++] = passengers[i];
if(j == busesSize-1)
{
max = cap;
m = i;
}
i++;
}
else//当前上不了,1、人满了,2、时间过了,需要等下一辆
{
j++;
cap = 0;
}
}
int min;
if(max < capacity)//最后一辆车人没有满
{
min = buses[busesSize-1];
}
else//人满了
{
min = ans[max-1];
}
for(i = m; i >= 0; i--)//防止重复
{
if(min == passengers[i])
{
min--;
}
}
return min;
}
时间空间复杂度