LeetCode 2332.坐上公交的最晚时间 (双指针 + 贪心)

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

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

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

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

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

示例 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 中的元素 互不相同

可以想到的是贪心,尽量去做最后一辆车,那么可以定义一个idx,然后去遍历整个数组,尽量让每辆车都坐满capacity人,如果最后那辆坐不满capacity人,那么答案就是最后那辆车的发车时间。做的满的话,idx就从后往前走,一直到能插进去上车即可

cpp 复制代码
class Solution {
public:
    int latestTimeCatchTheBus(vector<int>& buses, vector<int>& passengers, int capacity) {
        int n = buses.size(),m = passengers.size();
        sort(buses.begin(),buses.end());
        sort(passengers.begin(),passengers.end());
        // for(auto x : buses) cout << x << " ";
        // cout << endl;
        // for(auto x : passengers) cout << x << " ";
        // cout << endl;

        int idx = 0;
        int c;
        for(int i = 0;i < n;i ++){
            int k = buses[i];
            c = capacity;
            for(int j = 0;j < m && idx < m && c;j ++){
                if(passengers[idx] > k) break;
                idx ++, c --;
            }
        }

        idx --;
        // cout << idx << " " << c << endl;
        int res = (c ? buses[n - 1] : passengers[idx]);
        // cout << res << endl;
        while(idx >= 0 && res == passengers[idx]){
            idx --,res --;
        }
        return res;
    }
};

加油

相关推荐
_码力全开_13 分钟前
P1005 [NOIP 2007 提高组] 矩阵取数游戏
java·c语言·c++·python·算法·矩阵·go
墨染点香17 分钟前
LeetCode 刷题【124. 二叉树中的最大路径和、125. 验证回文串】
算法·leetcode·职场和发展
Camel卡蒙17 分钟前
红黑树详细介绍(五大规则、保持平衡操作、Java实现)
java·开发语言·算法
AhriProGramming29 分钟前
Flask-SQLAlchemy精读-双语精选文章
python·算法·flask
孤廖43 分钟前
吃透 C++ 栈和队列:stack/queue/priority_queue 用法 + 模拟 + STL 标准实现对比
java·开发语言·数据结构·c++·人工智能·深度学习·算法
BanyeBirth1 小时前
C++动态规划——LIS(最长不下降子序列)
算法·动态规划
小龙报1 小时前
《算法通关指南---C++编程篇(3)》
开发语言·c++·算法·visualstudio·学习方法·visual studio
凤山老林1 小时前
排序算法:详解插入排序
java·开发语言·后端·算法·排序算法
Mr_WangAndy2 小时前
C++设计模式_行为型模式_状态模式State
c++·设计模式·状态模式
郝学胜-神的一滴2 小时前
Effective STL 第5条:区间成员函数优先于单元素成员函数
开发语言·c++·程序人生·stl·软件工程