【LeetCode】2332. 坐上公交的最晚时间

devtools/2024/9/23 13:07:57/

LeetCode 2332. 坐上公交的最晚时间

题目描述

详细的题目描述可见LeetCode对应的原题目。

简单来说,给定 A A A数组[10, 20] B B B数组[2, 17, 18, 19],数组A表示公交车的到达时间,B表示乘客到达车站的时间,还给定一个公交车的容量capacity,假定为 2 2 2,问乘客最晚在何时到达可以乘坐公交车。

显然对于上述样例,在t=10之前达到的只有2时刻到达的乘客,因此第一辆车在t=10出发,只携带第一个到达的乘客(显然,第一辆车有一个空位,因为公交车的容量为 2 2 2)。而第二辆车驶离的时间是t=20,在此之前还未离开且到达的乘客分别在t=17/18/19到达,只有t=17/18到达的乘客可以离开,因为公交车的容量为 2 2 2

对于上述样例,乘客可行的最晚到达时间是t=16,因为题目要求乘客的到达时间不可重复,公交车的驶离时间也是不重复的。

思路

拿到这道题目给我的第一感觉就是双指针,解决该问题也确实用到了双指针,但是五分钟内没想出来,参考了题解,发现自己确实遗漏了一些细节,遂在此对整题的思路进行记录。

首先,可以对公交车的驶离时间和乘客的到达时间进行一下排序,因为初始的输入可能是无序的,但数组中的元素应该是有序的。

之后,便可以开始设计算法解决这道题目。

此处使用双指针,一个指针arrive指向公交车驶离时间的数组buses,而另一个指针pos指向乘客的到达时间数组passengers。对每一个公交车驶离的时间进行遍历,在遍历的每一步当中,需要对乘客到达时间的指针进行修改。在每一次迭代的初始时,设置一个变量space = capacity用于表示当前这辆车还剩下多少个空位。当公交车满载时,即使乘客已经达到也无法上车,按照先来后到没上车的乘客将登上下一辆车。

分析完问题之后,这道题目的双指针更新边界也就非常明朗了,可以抽象为如下代码:

while(space > 0 && pos < passengers.size() && passengers[pos] <= arrive) {space --;	// 当前车辆的位置减一pos ++;		// 满足条件的乘客上车
}

需要注意的是条件pos < passengers.size()一定是在passengers[pos] <= arrive之前的,因为按照C/C++条件运算符的优先级,对于&&运算,从左至右只要有一个条件不满足,那么直接返回false,如果先判断passengers[pos] <= arrive的话,此时的pos可能越界,即已经遍历完所有的passengers了。

下一步是对答案就行更新。乘客的最晚到达时间分为两种情况,第一种情况是最后一辆车还没有坐满,这是最理想的情况,乘客直接在最后一辆车的驶离时刻到达即可。第二种情况较为复杂,即最后一辆车也坐满了,它的最晚到达时间只能早于passengers当中从后往前找到的某个值,可以先令它为passengers[pos],再向前找到满足条件的值。

需要注意的是,根据刚才的分析,指针pos会指向满足迭代条件的下一个值(因为这样才会使循环达到条件而停止),因此在对答案进行更新之前需要先对pos --

最后一辆车的剩余位置为space,按照刚才的分析,答案res = buses.back() if space > 0 else passengers[pos]。如果res = passengers[pos],由于题目要求乘客不能同时到达,必须向前寻找满足条件的值,由于乘客在passengers中可能接连到达,因此使用下述逻辑来得到最终的res

while(pos >= 0 && passengers[pos] == res) {res --;pos --;
}

此处使用pos >= 0不必考虑边界情况,因为题目要求中明确指出passengers的值不会小于 2 2 2,意味着res最晚也可以是 1 1 1

C++的完整实现如下:

class Solution {
public:int latestTimeCatchTheBus(vector<int>& buses, vector<int>& passengers, int capacity) {sort(passengers.begin(), passengers.end());sort(buses.begin(), buses.end());int pos = 0;int space = 0;for(int arrive: buses) {space = capacity;while(space > 0 && pos < passengers.size() && passengers[pos] <= arrive) {pos ++;space --;}}pos --;int res = space > 0 ? buses.back() : passengers[pos];while(pos >= 0 && res == passengers[pos]) {res --;pos --;}return res;}
};

Go的实现如下:

func latestTimeCatchTheBus(buses []int, passengers []int, capacity int) int {sort.Ints(buses)sort.Ints(passengers)space, pos := 0, 0for _, arrive := range(buses) {space = capacityfor space > 0 && pos < len(passengers) && passengers[pos] <= arrive {space --pos ++}}pos --res := buses[len(buses)-1]if space <= 0 {res = passengers[pos]}for pos >= 0 && res == passengers[pos] {pos --res --}return res
}

【又学到了一些Go语法上的新知识,比如使用sort.Ints(buses)可以直接对整型数组进行排序】


http://www.ppmy.cn/devtools/116005.html

相关文章

Vue组件中的mixins

在 Vue.js 中&#xff0c;mixins 是一种分发可复用组件逻辑的灵活方式。一个 mixin 对象可以包含任何组件选项&#xff0c;如 data、methods、computed、watch 等。当一个组件使用了 mixin 时&#xff0c;mixin 中的所有选项都会被“混合”到该组件中&#xff0c;从而使得这些选…

C++离线查询

前言 C算法与数据结构 打开打包代码的方法兼述单元测试 概念及原理 离线算法( offline algorithms)&#xff0c;离线计算就是在计算开始前已知所有输入数据&#xff0c;输入数据不会产生变化&#xff0c;且在解决一个问题后就要立即得出结果的前提下进行的计算。 通俗的说&a…

C/C++逆向:switch语句逆向分析

在逆向分析中&#xff0c;switch语句会被编译器转化为不同的底层实现方式&#xff0c;这取决于编译器优化和具体的场景。常见的实现方式包括以下几种&#xff1a; ①顺序判断&#xff08;if-else链&#xff09;&#xff1a; 编译器将switch语句转化为一系列的if-else语句。这…

git安装包夸克网盘下载

git安装包夸克网盘下载 git夸克网盘 git网站上的安装包下载速度有点慢&#xff0c;因此为了方便以后下载就将文件保存到夸克网盘上&#xff0c;链接&#xff1a;我用夸克网盘分享了「git」&#xff0c;点击链接即可保存。 链接&#xff1a;https://pan.quark.cn/s/07c73c4a30…

Nginx-HTTP和反向代理web服务器

概述 Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器 &#xff0c;同时也提供了IMAP/POP3/SMTP服务。Nginx是由伊戈尔赛索耶夫为俄罗斯访问量第二的Rambler.ru站点&#xff08;俄文&#xff1a;Рамблер&#xff09;开发的&#xff0c;公开版本1.19.6发布于20…

【MYSQL】聚合查询、分组查询、联合查询

目录 聚合查询聚合函数count()sum()avg()max()和min()总结 分组查询group by 子句having 子句 联合查询笛卡尔积内连接外连接自连接子查询单行子查询多行子查询from子句使用子查询 合并查询 聚合查询 聚合查询就是针对表中行与行之间的查询。 聚合函数 count() count(列名)&a…

部署自己的对话大模型,使用Ollama + Qwen2 +FastGPT 实现

部署资源 AUTODL 使用最小3080Ti 资源&#xff0c;cuda > 12.0使用云服务器&#xff0c;部署fastGPT oneAPI&#xff0c;M3E 模型 操作步骤 配置代理 export HF_ENDPOINThttps://hf-mirror.com下载qwen2模型 - 如何下载huggingface huggingface-cli download Qwen/Qwen2-…

Linux学习笔记(2)

Linux学习笔记&#xff08;2&#xff09; 知识点&#xff1a; 1.打包、压缩——是什么、为什么、怎么做&#xff1f; 什么是打包、压缩&#xff1f; 打包&#xff1a;把文件合并。 压缩&#xff1a;通过一定算法减少体积。 为什么要进行打包、压缩&#xff1f; 打包&…