LC9.18

LC9-18

2332. 坐上公交的最晚时间

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

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

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

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

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

示例 1:

1
2
3
4
5
6
输入:buses = [10,20], passengers = [2,17,18,19], capacity = 2
输出:16
解释:
1 辆公交车载着第 1 位乘客。
2 辆公交车载着你和第 2 位乘客。
注意你不能跟其他乘客同一时间到达,所以你必须在第二位乘客之前到达。

示例 2:

1
2
3
4
5
6
输入: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 中的元素 互不相同

要实现最晚上车有两种情况,第一种是车都有人做的情况下,插队到最后一个人的前面,第二种情况,车没坐满的情况下,卡点上车。由于不能重复别人的上车时间,所以需要用set来判断下。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
func latestTimeCatchTheBus(buses []int, passengers []int, capacity int) (ans int) {
sort.Ints(buses)
sort.Ints(passengers)
set := make(map[int]struct{})
for _, passenger := range passengers {
set[passenger] = struct{}{}
}
i := 0
m := len(passengers)
for _, bus := range buses {
k := capacity
for i < m && k > 0 && passengers[i] <= bus {
if _, ok := set[passengers[i]-1]; !ok {
ans = passengers[i] - 1
}
k--
i++
}
if k > 0 {
if _, ok := set[bus]; !ok {
ans = bus
}
}
}
return
}
  • 时间复杂度: O(nlogn+nlogm)
  • 空间复杂度: O(1)

LC9.18
http://example.com/2024/09/18/LC9-18/
作者
ykexc
发布于
2024年9月18日
许可协议