C++ 访问所有点的最短时间:理解

C++ 访问所有点的最短时间:理解,c++,C++,我试图解决leetcode的一个问题——“访问所有点的最短时间”。以下是问题的描述- 在一个平面上有n个整数坐标点[i]=[xi,yi]。您的任务是找到访问所有点的最短时间(以秒为单位) 您可以根据以下规则移动: 在一秒钟内,您可以垂直、水平移动一个单位,也可以对角移动(这意味着在一秒钟内垂直移动一个单位,水平移动一个单位)。 您必须按照点在阵列中的显示顺序访问这些点 Input: points = [[1,1],[3,4],[-1,0]] Output: 7 Explanation: One

我试图解决leetcode的一个问题——“访问所有点的最短时间”。以下是问题的描述-

在一个平面上有n个整数坐标点[i]=[xi,yi]。您的任务是找到访问所有点的最短时间(以秒为单位)

您可以根据以下规则移动:

在一秒钟内,您可以垂直、水平移动一个单位,也可以对角移动(这意味着在一秒钟内垂直移动一个单位,水平移动一个单位)。 您必须按照点在阵列中的显示顺序访问这些点

Input: points = [[1,1],[3,4],[-1,0]]
Output: 7
Explanation: One optimal path is [1,1] -> [2,2] -> [3,3] -> [3,4] -> [2,3] -> [1,2] -> [0,1] -> [-1,0]   
Time from [1,1] to [3,4] = 3 seconds 
Time from [3,4] to [-1,0] = 4 seconds
Total time = 7 seconds
通过解决几个例子,我能够以这种方式解决这个问题-

ans += max(abs(points[i][1] - points[i - 1][1]), abs(points[i][0] - points[i - 1][0]))
通过将“i”从1循环到points.size(),但我无法直观地理解这个问题。
有人能帮我把这个问题内化一下吗?

既然你可以对角移动,移动的次数只受最长维度的限制,要么是
x
要么是
y
。想想看:如果下一个节点距离
+10x
-5y
较远,它将需要整整10个步骤,因为一次只能移动1个
x
,而
y
中的差异是在克服
x
中的差异的过程中通过对角线移动来弥补的

您的代码清楚地表达了这一细节:

如果
dy=abs(点[i][1]-点[i-1][1])

dx=abs(点[i][0]-点[i-1][0])

通过选择
dx
dy
中较大的一个,您可以精确地找到它将需要多少步,因为较小的差异将被对角线步数克服,以获得较大的结果。 因此,你必须:

ans+=max(dy,dx)


这保证为每对点提供正确的步数。正如@flowit所指出的,每个连续点对之间的最短路径保证是整个点集的最短路径,因此您可以得到正确的总体答案。

如果其他人对此感到困惑,只需在纸上画出点,并手动计算在点之间移动的不同方式。
你会马上明白,最短的距离是X或Y边上最长的距离,因为对角移动被计算为1,即与X或Y移动相同。

如果有人仍然对此感到困惑,基本上核心逻辑是

class Solution:
    def minTimeToVisitAllPoints(self, points: List[List[int]]) -> int:
        path = 0
        for i in range(len(points) -1):
            path += max(abs(points[i][0] - points[i+1][0]), abs(points[i][1] - points[i+1][1])) 
        return path
最大距离=最大值(abs(x2-x1)、abs(y2-y1))

该最大距离数字给出了从点1=[x1,y1]到点2=[x2,y2]的秒数

然后,对第2点和第3点重复相同的逻辑,以此类推


最后,将所有最大距离相加,这将为您提供一个需要添加的答案:所有3个点之间的最短路径(或N个点,如果您概括问题)是所有连续点之间所有最短路径的总和。不幸的是,我不能给出数学证明。如果允许您以任意顺序访问这些点,则不再是这样。您可以以
时间
单位
移动
x
y
,或
x,y
步骤
s
),对吗?