根据速度和位置查找车队

问题描述 投票:0回答:1

我目前正在尝试解决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

python-3.x data-structures stack
1个回答
0
投票

你没有考虑到一辆车一追上它就减慢到前面车的速度,所以你不能比较任意两辆车到达目的地的时间。相反,您可以按位置对所有汽车进行排序(每个位置保证是唯一的)并跟踪当前车队的领导者。

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
© www.soinside.com 2019 - 2024. All rights reserved.