青训营X豆包MarsCode 技术训练营:AI刷题笔记-05 | 豆包MarsCode AI 刷题

105 阅读3分钟

AI刷题笔记 05

题目描述:小U走公路

小U正沿着一条环形公路行走,公路上有n个站点,每个相邻站点之间都有已知的顺时针距离。她需要从站点 x 走到站点 y,并且想知道从站点 x 到站点 y 的最短距离。公路是环形的,因此从 x 到 y 可以顺时针或逆时针行走。你需要计算小U走的最短距离。

样例1

输入:n=3,a=[1,2,2],x=2,y=3输出:2

解题核心思路

核心为求每个两个点之间的距离相加,由于有顺时针和逆时针两种方式,因此,有两种思路:

  1. 顺时针方向
    • 按照数组 a 中的顺时针距离从 x 到 y 累加距离。
  2. 逆时针方向
    • 按照数组 a 中的逆时针距离从 x 到 y 累加距离。
    • 可以通过总距离减去顺时针距离来快速计算逆时针距离。

题目分析

解题步骤
  1. 将站点索引转为从 0 开始,便于数组操作。
  2. 计算顺时针距离:
    • 累加 a 中从 x 到 y 的距离。
    • 如果 x>y,需要绕过数组尾部回到起点。
  3. 计算逆时针距离:
    • 总距离为数组 a 的所有元素之和。
    • 逆时针距离等于总距离减去顺时针距离。
  4. 返回两者中的最小值。
步骤解析

将环形路段的距离转化为数组内数据的相加计算,在数组内按照顺序进行两点距离之间的相加计算,且由于顺时针或逆时针都课可行,并要求得出最小的距离。因此,我们无需管x与y之间的大小顺序(有关于小U进行顺时针行走还是逆时针行走),我们只需将其确定顺序,X<Y即可,而后计算全部的总路程,用总路程减去两点X,Y之间有关于顺时针的路程(可能正常的从X到Y的行走为逆时针,但是由于有两种方式,并最终结果为判断最短距离,因此,我们无需在前期明确顺时针最短还是逆时针最短,我们可以全部求出,最后通过比较进行筛选),此时我们分别得到了向两个方向行走的两端距离,而通过比较大小,得出最终的结果。

最终代码
def solution(n, a, x, y):
    # 将站点转换为从 0 开始的索引
    x -= 1
    y -= 1
    
    # 如果 x 大于 y,则交换 x 和 y,方便处理顺时针方向
    if x > y:
        x, y = y, x
    
    # 计算顺时针距离
    clockwise_distance = sum(a[x:y])
    
    # 计算总距离
    total_distance = sum(a)
    
    # 计算逆时针距离
    counter_clockwise_distance = total_distance - clockwise_distance
    
    # 返回最短距离
    return min(clockwise_distance, counter_clockwise_distance)

代码解释
n = 3
a = [1, 2, 2]
x = 2
y = 3
print(solution(n, a, x, y))  # 输出: 2
  • 顺时针:站点 2 到站点 3,距离是 a[1]=2。
  • 逆时针:总距离 5,减去顺时针距离 2,得到 3。
  • 最短距离为 2。
补充说明

该题目不是一道很困难的题目,整体的思路非常简单,但是一开始我就想要比较顺时针与逆时针的最优解,而加大了工作量。若一开始作为前置条件无法解决时,可简化思路,直接在最终进行最优解判断。