当前位置: 首页 > article >正文

【每日一题】LeetCode 2332.坐上公交的最晚时间(数组、双指针、二分查找、排序)

【每日一题】LeetCode 2332.坐上公交的最晚时间(数组、双指针、二分查找、排序)

题目描述

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

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

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

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

**注意:**数组 busespassengers 不一定是有序的。

思路分析

  1. 排序:首先对 busespassengers 数组进行排序,这样可以方便我们按照时间顺序处理乘客和公交车。
  2. 遍历:遍历 buses 数组,对于每一辆公交车,检查在当前公交车出发时间之前到达的乘客数量,直到公交车满员或者所有乘客都已经被处理。
  3. 计算最晚到达时间:在遍历过程中,我们需要记录下在每辆公交车出发之前能够搭载的最后一个乘客的时间。这个时间点就是我们的候选答案。
  4. 调整时间:由于乘客不能与他人同时到达,我们需要在找到的候选答案基础上继续向前寻找,直到找到一个没有乘客到达的时间点,这个时间点就是我们可以返回的最晚到达时间。

输入示例

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

提示:

  • n == buses.length
  • m == passengers.length
  • 1 <= n, m, capacity <= 105
  • 2 <= buses[i], passengers[i] <= 109
  • buses 中的元素 互不相同
  • passengers 中的元素 互不相同

代码实现

import java.util.Arrays;

class Solution {
    public int latestTimeCatchTheBus(int[] buses, int[] passengers, int capacity) {
        // 对公交车和乘客的时间进行排序
        Arrays.sort(buses);
        Arrays.sort(passengers);

        int j = 0;  // 用于指向乘客数组
        int c = 0;  // 当前车辆的剩余容量

        // 遍历每一班公交车的时间
        for (int i = 0; i < buses.length; i++) {
            // 检查当前公交车在出发前能搭载的乘客数量
            while (c < capacity && j < passengers.length && passengers[j] <= buses[i]) {
                j++; // 当前乘客上车,指向下一个乘客
                c++; // 减少当前车辆的剩余容量
            }
        }

        // 找到插队的最佳时机
        j--; // 上一步中 j 可能超出乘客数组的索引,需要回到最后一位有效乘客
        int ans = c > 0 ? buses[buses.length - 1] : passengers[j]; // 如果最后一班车还有空位,最新的时间点就是最后一班车的时间;否则要找到一个乘客离开的时间点

        // 如果乘客离开时间点与我们选择的时间点相同,则需要往前寻找
        while (j >= 0 && ans == passengers[j]) {
            ans--; // 往前找没有乘客的时间点
            j--;
        }
        return ans; // 返回最终的时间点
    }
}

http://www.kler.cn/a/308707.html

相关文章:

  • 《C++在金融领域的技术革命:高效、安全与创新的融合》
  • 【C#设计模式(8)——过滤器模式(Adapter Pattern)】
  • C++初阶——list
  • Java项目实战II基于微信小程序的个人行政复议在线预约系统微信小程序(开发文档+数据库+源码)
  • 彻底理解ARXML中的PDU
  • LeetCode【0027】移除元素
  • 大数据新视界 --大数据大厂之Kafka消息队列实战:实现高吞吐量数据传输
  • Wophp靶场漏洞挖掘
  • 如何在webots中搭建一个履带机器人
  • RISC-V交叉编译器下载
  • 誉龙视音频综合管理平台 RelMedia/FindById SQL注入漏洞复现
  • 如何为聊天机器人添加检索功能:增强响应能力
  • 已开源!无限场景生成和高效数据迁移:3D金字塔扩散模型斩获ECCV24 Oral
  • 错误: 找不到或无法加载主类 org.apache.zookeeper.server.quorum.QuorumPeerMain
  • 设计模式 桥接模式(Bridge Pattern)
  • MySQL——数据库的高级操作(三)权限管理(1)MySQL 的权限
  • 基于微信小程序的高校实验室管理系统的设计与实现
  • 25届校招IQCAT思维能力自适应测验智鼎测评指南:题库获取、刷题策略与真题解析!
  • 单片机实现内存管理的C语言实现
  • 【计网】从零开始使用TCP进行socket编程 --- 客户端与服务端的通信实现
  • 如何使用ssm实现物流配送人员车辆调度管理系统的设计与实现+vue
  • vue3前端tab切换
  • dll修复工具4DDiG DLL Fixer,解决电脑dll丢失问题
  • curl格式化json之jq工具?
  • SpringMVC的初理解
  • ZooKeeper远程连接超时排查与解决