前言
每天和你一起刷 LeetCode 每日一题~
LeetCode 启动!
题目:坐上公交的最晚时间
代码与解题思路
func latestTimeCatchTheBus(buses []int, passengers []int, capacity int) (ans int) {
// 核心思路分析:
// 你可以搭乘公交车的最晚到达公交站时间。你 不能 跟别的乘客同时刻到达。
// 总结来看就是,需要找最晚的一班车,并且不能和其他乘客同时间到达
// 换成解题思路来看,就是找到坐最后一辆公交车的最后一个乘客
// 并找到在他之前的一个时间,插队上车,顶掉最后一个乘客
// 而:数组 buses 和 passengers 不一定是有序的。那就先排序
slices.Sort(buses)
slices.Sort(passengers)
// 先上车,找到前面说的:倒数第二个乘客 // 这里习惯性用 j 了,那就改成 j 吧
j, c := 0, 0 // j 代表第 j 位乘客,c 代表当前巴士还能载客的数量
for _, t := range buses { // 枚举巴士到达的时间
c = capacity // 每一辆新的巴士就能更新成 capacity
for c > 0 && j < len(passengers) && passengers[j] <= t { // 枚举能做这辆巴士的乘客
j++ // 乘客+1
c-- // 载客量-1
}
}
// 现在的 p 代表的就是最后一个上车的乘客,c 代表当前巴士的空位
if c > 0 { // 如果还有空位
ans = buses[len(buses)-1] // 先预设在公交车刚到的时候上车(题目要求:最晚到达公交站时间)
j-- // 这里也需要 j--, 否则可能出现数组下标越界问题
} else { // 如果坐满了
ans = passengers[j-1] // 根据我们的分析,找到:最后一个乘客
j-- // 顶掉最后一个乘客
}
// 找一个和别的乘客不同时刻到达的时间
for j >= 0 && ans == passengers[j] {
j--
ans--
}
return ans
}
核心思路如注释
我最开始也没看懂题目在说些什么,写的真的太难懂了
还好在评论区有一位中译中大师,他的翻译如下: 你患有拖延症和社恐,但很不巧的是你今天必须坐公交回家。 所以,你需要在末班车开走之前,尽量晚的时间,并且不与其他乘客同时到达公交站。
对照这个解释,多看几遍题目和样例,终于恍然大悟
视频实况
【【LeetCode】每日一题 2024_9_18 坐上公交的最晚时间(排序,模拟)】
每天进步一点点
可以和我刷一辈子的每日一题吗?
一题一题,积累起来就是一辈子。