我目前正在尝试解决leetcode问题853。车队具有以下描述
一条单车道道路上有 n 辆汽车前往同一目的地。目的地距离目标英里。
给定两个整数数组位置和速度,长度均为n,其中position[i]是第i辆车的位置,speed[i]是第i辆车的速度(以英里每小时为单位)。
一辆车永远无法超过它前面的另一辆车,但它可以追上它并以相同的速度行驶。较快的汽车将减速以匹配较慢的汽车的速度。忽略这两辆车之间的距离(即,假设它们具有相同的位置)。
车队是一些以相同位置和相同速度行驶的非空汽车集合。请注意,单辆车也是一个车队。
如果一辆汽车在目的地正好追上车队,它仍将被视为一个车队。
返回将到达目的地的车队数量。
`示例1:
输入:目标 = 12,位置 = [10,8,0,5,3],速度 = [2,4,1,1,3] 输出:3 解释: 从 10(速度 2)和 8(速度 4)开始的汽车组成一个车队,在 12 处相遇。 从 0 开始的汽车不会追上任何其他汽车,因此它本身就是一个车队。 从 5(速度 1)和 3(速度 3)开始的汽车组成一个车队,在 6 处相遇。车队以速度 1 移动,直到到达目标。 请注意,在到达目的地之前没有其他车辆与这些车队相遇,因此答案为 3。 示例2:
输入:目标 = 10,位置 = [3],速度 = [3] 输出:1 说明:只有一辆车,因此只有一支车队。 例3:
输入:目标 = 100,位置 = [0,2,4],速度 = [4,2,1] 输出:1 解释: 从 0(速度 4)和 2(速度 2)开始的汽车组成一个车队,在 4 处相遇。车队以速度 2 移动。 然后,车队(速度 2)和从 4 出发的汽车(速度 1)成为一支车队,在 6 处相遇。车队以速度 1 移动,直到到达目标。`
我想创建自己的解决方案,并且我认为堆栈是在最佳解决方案中解决此问题的好方法(可能是 O(n) 时间复杂度)。 3个测试用例都通过了,但是提交解决方案时,其他辅助测试用例没有通过,如下所示: `目标= 10 位置= [0,4,2] 速度= [2,1,3]
使用测试用例 输出 2 预期的 1`
目前的解决方案:
def carFleet(self, target: int, position: List[int], speed: List[int]) -> int:
stack = []
for i in range(len(position)):
time = (target - position[i]) / speed[i]
while stack and time >= stack[-1]:
stack.pop()
stack.append(time)
return len(stack)
我认为我在 while 循环中采用的方法是正确的(但如果算法没有通过所有测试用例,我有什么资格说),因为通过 while 循环,我正在删除将要运行的汽车追上前面速度较慢的汽车,因此最终堆栈中存在的元素是车队(堆栈的长度 (O(1)))。你们有什么感想? 任何提示将不胜感激,保重:D
你没有考虑到一辆车一追上它就减慢到前面车的速度,所以你不能比较任意两辆车到达目的地的时间。相反,您可以按位置对所有汽车进行排序(每个位置保证是唯一的)并跟踪当前车队的领导者。
def carFleet(self, target: int, position: List[int], speed: List[int]) -> int:
cars = sorted(range(len(speed)), reverse=True, key=lambda i: position[i])
ans = len(speed) + 1
curr = cars[0]
for c in cars:
if (target - position[c]) / speed[c] <= (target - position[curr]) / speed[curr]:
ans -= 1
else:
curr = c
return ans