竞赛·6117.坐公交车的最晚时间·模拟

该博客介绍了如何解决一个算法问题,即在给定公交车发车时间和乘客到达时间的情况下,确定最晚到达车站还能赶上最后一班车的时间。通过快速排序对数据进行预处理,然后遍历乘客和公交车,计算出车站等车人数,根据公交车容量找到合适的上车时间。如果最后一班车未满员,则最晚到达时间为车到时间;若已满员,则找到第capacity个乘客的时间。最后检查并排除可能的时间重复,确保答案正确。
摘要由CSDN通过智能技术生成


链接: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;
}


时间空间复杂度

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值