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 位乘客和你。

解题思路:
1.对公交发车时间和乘客到达时间进行排序。
2.模拟每班车的发车过程,更新已乘坐的乘客数量。
3.确定最后一班车或最后一个能上车的乘客的时间。
4.逐步减小时间,直到找到最晚能够赶上车的时间。

代码解释:
   // 排序乘客上车的时间
    Arrays.sort(buses);
    Arrays.sort(passengers);
    // 初始化乘客位置索引为0
    int pos = 0;
    // 初始化每辆公交车剩余座位数为0
    int space = 0;

    // 遍历每个公交车的发车时间,当前车还有空位
    for (int arrive : buses) {
        // 初始化每辆车的剩余座位为capacity
        space = capacity;
        //并且还有乘客未上车,并且当前乘客可以在当前车发车前到达,则继续循环
        while (space > 0 && pos < passengers.length && passengers[pos] <= arrive) {
            space--;
            pos++;
        }
    }
    // 这里需要详细解释下为什么要回退一步?
    //    在循环中,每次处理一个乘客时,会检查当前乘客是否可以在当前公交车发车前到达,
    //    如果可以,就会让这个乘客上车,并将 pos 加1,表示处理了这个乘客
    //      假设最后一班车的情况如下:
    //          最后一班车的发车时间为 arrive。
    //          假设最后一个乘客刚好可以赶上这班车,即 passengers[pos] <= arrive。
    //          这时 pos 会加1,表示这个乘客已经处理完了,
    //      但是,我们需要找到的是 最晚 能够赶上车的时间。因此
    //          如果最后一班车还有空位 (space > 0),那么最晚时间就是最后一班车的发车时间 buses[buses.length - 1],
    //          如果最后一班车已经满员 (space <= 0),那么最晚时间就是最后一个能上车的乘客的到达时间 passengers[pos]由于循环结束后 pos 已经指向了下一个乘客,
    //      因此需要将 pos 减1,回退到上一个乘客,这样才能正确地获取最晚时间
    pos--;
    // 条件判断:space > 0 判断最后一班车是否还有空位。
    //         如果 space > 0,说明最后一班车还有空位,那么最晚时间就是最后一班车的发车时间 buses[buses.length - 1]。
    //         如果 space <= 0,说明最后一班车已经满员,那么最晚时间就是最后一个能上车的乘客的到达时间 passengers[pos]
    int lastCatchTime = space > 0 ? buses[buses.length - 1] : passengers[pos];
    // 如果当前位置有效 (pos >= 0) 并且当前乘客的到达时间等于最晚时间,则继续回退 pos 和减少 lastCatchTime,直到找到最晚能够赶上车的时间
    while (pos >= 0 && passengers[pos] == lastCatchTime) {
        pos--;
        lastCatchTime--;
    }

    return lastCatchTime;

posted @ 2024-09-18 16:01  JAVA-CHENG  阅读(11)  评论(0编辑  收藏  举报