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

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

时间:2024-09-18 13:51:48浏览次数:12  
标签:二分 passengers 2332 公交车 buses 乘客 int 时间 LeetCode

【每日一题】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; // 返回最终的时间点
    }
}

标签:二分,passengers,2332,公交车,buses,乘客,int,时间,LeetCode
From: https://blog.csdn.net/Hanbuhuic/article/details/142321662

相关文章

  • 【数据结构和算法实践-树-LeetCode112-路径总和】
    数据结构和算法实践-树-LeetCode112-路径总和题目MyThought代码示例JAVA-8题目给你二叉树的根节点root和一个表示目标和的整数targetSum。判断该树中是否存在根节点到叶子节点的路径,这条路径上所有节点值相加等于目标和targetSum。如果存在,返回true;否则......
  • Leetcode 315. 计算右侧小于当前元素的个数
    1.题目基本信息1.1.题目描述给你一个整数数组nums,按要求返回一个新数组counts。数组counts有该性质:counts[i]的值是nums[i]右侧小于nums[i]的元素的数量。1.2.题目地址https://leetcode.cn/problems/count-of-smaller-numbers-after-self/description2.解题方法......
  • 代码随想录Day3 | LeetCode 203. 移除链表元素、LeetCode 707. 设计链表、LeetCode 20
    LeetCode203.移除链表元素链表基础概念题,也可以用递归做,不过我们把递归的思想放在更能体现它的LeetCode206.反转链表#Definitionforsingly-linkedlist.#classListNode:#def__init__(self,val=0,next=None):#self.val=val#self.next......
  • 代码随想录Day4 | LeetCode 24. 两两交换链表中的节点、LeetCode 19. 删除链表的倒数
    LeetCode24.两两交换链表中的节点递归思想#Definitionforsingly-linkedlist.#classListNode:#def__init__(self,val=0,next=None):#self.val=val#self.next=nextclassSolution:defswapPairs(self,head:Optional[ListNode......
  • LeetCode415周赛T2 +T3
    最高乘法得分动态规划解决从数组b中选择下标的问题题目描述给你一个大小为4的整数数组a和一个大小至少为4的整数数组b。你需要从数组b中选择四个下标i0,i1,i2,和i3,并且要求满足i0<i1<i2<i3。你的得分将是:a[0]*b[i0]+a[1]*b[i1]+a[2]*b......
  • leetcode232. 用栈实现队列
    leetcode232.用栈实现队列请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push、pop、peek、empty):实现MyQueue类:voidpush(intx)将元素x推到队列的末尾intpop()从队列的开头移除并返回元素intpeek()返回队列开头的元素booleanempt......
  • 代码随想录算法训练营第一天|704二分查找 27移除数组 977.有序数组的平方
    704二分查找给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target  ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。示例1:输入:nums=[-1,0,3,5,9,12],target=9输出:4解释:9出现在nums中并且下标为4示例 2:输......
  • 代码随想录Day2 | LeetCode 209. 长度最小的子数组、LeetCode 59. 螺旋矩阵 II、KamaC
    LeetCode209.长度最小的子数组子数组是一个连续的,很容易想到滑动窗口classSolution:defminSubArrayLen(self,target:int,nums:List[int])->int:windowSum=0left,right=0,0res=float('inf')whileright<len(nums......
  • 二分详解——学习笔记
    首先,使用二分有几个前提:具有单调性要求“最小的最大”或“最大的最小”其次,还要分清楚二分查找与二分答案的区别:二分查找:在某区间使用二分的思想进行查找二分答案:在答案的区间中使用二分的思想并判断从而找到最优解同时还要处理好二分的边界。接下来来理解一下......
  • 【LeetCode Hot 100】5. 最长回文子串
    题目描述考虑回文字符串的特点,从左往右和从右往左读都是一样的,就是说字符串成了“轴对称”。要求一字符串的最长回文子串,我们可以遍历每个字符,求以该字符为轴对称中心的最长对称子串(或者以该字符和下一个字符为中间两个字符的对称子串),在所有这样的子串中长度最长的那个就是我们要......