模拟+分类讨论,LeetCode 2332. 坐上公交的最晚时间

一、题目

1、题目描述

给你一个下标从 0 开始长度为 n 的整数数组 buses ,其中 buses[i] 表示第 i 辆公交车的出发时间。同时给你一个下标从 0 开始长度为 m 的整数数组 passengers ,其中 passengers[j] 表示第 j 位乘客的到达时间。所有公交车出发的时间互不相同,所有乘客到达的时间也互不相同。

给你一个整数 capacity ,表示每辆公交车 最多 能容纳的乘客数目。

每位乘客都会搭乘下一辆有座位的公交车。如果你在 y 时刻到达,公交在 x 时刻出发,满足 y <= x  且公交没有满,那么你可以搭乘这一辆公交。最早 到达的乘客优先上车。

返回你可以搭乘公交车的最晚到达公交站时间。你 不能 跟别的乘客同时刻到达。

注意:数组 buses 和 passengers 不一定是有序的。

2、接口描述

python3
 ​
class Solution:
    def latestTimeCatchTheBus(self, buses: List[int], passengers: List[int], capacity: int) -> int:
cpp
 ​
class Solution {
public:
    int latestTimeCatchTheBus(vector<int>& buses, vector<int>& passengers, int capacity) {
        
    }
};
C#
 ​
public class Solution {
    public int LatestTimeCatchTheBus(int[] buses, int[] passengers, int capacity) {

    }
}

3、原题链接

2332. The Latest Time to Catch a Bus


二、解题报告

1、思路分析

将车 和 乘客都升序排序

随着来的乘客越来越晚,其能登上的车也就越靠后

考虑双指针

遍历每个车,维护一个乘客指针,只要当前乘客能上车就后移

结束后,如果最后一个车没满,那么从最后一个车的发车时间往前倒推,找到一个空闲时间点

否则,从最后一个上车的乘客往前倒推,找到一个空闲时间点

由于最多倒推 len(p[assengers) 次,所以可行

2、复杂度

时间复杂度: O(nlogn + mlogn)空间复杂度:O(1)

3、代码详解

python3
 ​
class Solution:
    def latestTimeCatchTheBus(self, buses: List[int], passengers: List[int], capacity: int) -> int:
        buses.sort()
        passengers.sort()
        cur = cnt = 0
        for x in buses:
            cnt = capacity
            while cur < len(passengers) and cnt and x >= passengers[cur]:
                cur += 1
                cnt -= 1
        cur -= 1
        res = buses[-1] if cnt else passengers[cur]
        while cur >= 0 and res == passengers[cur]:
            res -= 1
            cur -= 1
        return res
cpp
 ​
class Solution {
public:
    int latestTimeCatchTheBus(vector<int>& buses, vector<int>& passengers, int capacity) {
        std::ranges::sort(buses), std::ranges::sort(passengers);
        int cnt = capacity, cur = 0;
        for (int x : buses) {
            cnt = capacity;
            while (cur < passengers.size() && cnt > 0 && x >= passengers[cur])
                ++cur, --cnt;
        }
        --cur;
        int res = cnt > 0 ? buses.back() : passengers[cur];
        while (cur >= 0 && res == passengers[cur])
        {
            --res;
            --cur;
        }
        return res;
    }
};
C#
 ​
public class Solution
{
    public int LatestTimeCatchTheBus(int[] buses, int[] passengers, int capacity)
    {
        Array.Sort(buses);
        Array.Sort(passengers);
        int cur = 0, cnt = 0;
        foreach(int x in buses)
        {
            cnt = capacity;
            while (cur < passengers.Length && cnt > 0 && x >= passengers[cur])
            {
                ++cur;
                --cnt;
            }
        }
        --cur;
        int res = cnt > 0 ? buses[buses.Length - 1] : passengers[cur];
        while (cur >= 0 && res == passengers[cur])
        {
            --res;
            --cur;
        }
        return res;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

EQUINOX1

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值