赛道排名变化 | 豆包MarsCode AI刷题

120 阅读3分钟

问题描述

小l组织了一场拉力赛,有nn辆赛车,起初每辆车的排名依次为nn,n1n-1,……,11,即离起点最远的赛车排名最低,每辆赛车有一个初始位置pip_i和速度viv_i,在tt个单位时间后,每辆车会按照其速度匀速前进。小l想知道,在tt个单位时间后,有多少赛车的排名发生了上升。

保证一开始所有的赛车位置不相同。

如果在tt个单位时间后有两辆车的位置相同,则这两辆车的排名相同。一辆车的排名为在它前面的车辆的个数加11


测试样例

样例1:

输入:n = 3 ,t = 1 ,p = [1, 2, 3] ,v = [3, 1, 3]
输出:1

样例2:

输入:n = 5 ,t = 2 ,p = [0, 2, 4, 6, 8] ,v = [5, 2, 6, 4, 1]
输出:2

样例3:

输入:n = 4 ,t = 3 ,p = [2, 5, 9, 14] ,v = [2, 4, 3, 1]
输出:1

题目解析:

题目要求计算在指定时间t后,有多少赛车的排名发生了上升。起始时每辆赛车的位置和速度已知,我们需要基于这些信息计算每辆赛车在tt时间后的最终位置,进而得出它们的最终排名,并与初始排名进行比较,以确定排名是否上升。

思路分析:

  1. 初始排名和位置:起始时每辆赛车排名为nn,n1n-1,……,11,即位置越靠后的赛车,初始排名越低。
  2. 位置变化:在𝑡𝑡时间后,每辆赛车的最终位置可以通过公式𝑝𝑖𝑝_𝑖+𝑣𝑖𝑣_𝑖×𝑡𝑡计算。
  3. 排序确定排名:根据赛车的最终位置进行排序,得到在tt时间后的最终排名。
  4. 统计排名上升情况 :比较每辆赛车的最终排名与其初始排名。如果最终排名(即排在前面的车辆数)比初始排名靠前,则表示该车排名上升。

解决方案:

  1. 计算最终位置:计算每辆车赛车在tt时间后的最终位置。
  2. 排序确定排名:根据赛车的最终位置排序以确定排名,若位置相同则排名相同。
  3. 比较排名变化:统计那些最终排名比初始排名靠前的赛车数量。

代码实现:

def solution(n: int, t: int, p: list, v: list) -> int:
    # 计算每辆车在 t 时间后的最终位置
    final_positions = [(p[i] + v[i] * t, i) for i in range(n)]
    
    # 按照最终位置排序,记录最终排名
    final_positions.sort()
    
    # 统计排名上升的数量
    rank_increase_count = 0
    for final_rank, (_, initial_rank) in enumerate(final_positions):
        if final_rank > initial_rank:
            rank_increase_count += 1

    return rank_increase_count

代码解释:

  1. 最终位置计算final_positions = [(p[i] + v[i] * t, i) for i in range(n)],这里的final_positions是一个列表,记录了每辆赛车在tt时间后的最终位置及其原始索引。

  2. 排序final_positions.sort() 根据最终位置排序赛车的列表,位置越靠前的赛车排名越高。

  3. 排名比较for final_rank, (_, initial_rank) in enumerate(final_positions) 遍历排序后的列表,通过初始排名与最终排名比较,若最终排名更靠前则计数rank_increase_count

  4. 返回结果:最后返回总的排名上升数量。

示例测试:

  1. 样例1

    print(solution(3, 1, [1, 2, 3], [3, 1, 3]))  # 输出 1
    
  2. 样例2

    print(solution(5, 2, [0, 2, 4, 6, 8], [5, 2, 6, 4, 1])) # 输出 2
    
  3. 样例3

    print(solution(4, 3, [2, 5, 9, 14], [2, 4, 3, 1])) # 输出 1
    

时间复杂度:

  • 位置计算O(n)O(n),需要遍历每辆车来计算最终位置。
  • 排序O(nlogn)O(nlogn),需要对最终位置排序。
  • 排名比较O(n)O(n),比较排名需要遍历一遍。

因此,整体时间复杂度为O(nlogn)O(nlogn)

空间复杂度:

  • 使用了额外的数组 final_positions 存储位置和索引,因此空间复杂度为 O(n)O(n)

总结

这道题的关键在于理解位置更新与排序的关系,通过比较最终排名和初始排名确定排名上升的车辆数量。