一道难懂但简单的leetCode题-1266.访问所有点的最小时间

433 阅读3分钟

题记

最近学完python的基本语法,想巩固下python基础,于是开始在leetCode上刷一些easy的题目,最开始是刷数组方面的题目(数组方面的easy题一般比较简单)。直到今天,我刷到了这道题1266.访问所有点的最小时间,题目看了两三遍才看懂题目的意思但是想了10分钟左右还是没有解题思路,于是看了该题目的题解,发现这题目有点意思,难度不在解题而在于解题的思路。

题目

1266. 访问所有点的最小时间

描述:

平面上有 n 个点,点的位置用整数坐标表示 points[i] = [xi, yi] 。请你计算访问所有这些点需要的 最小时间(以秒为单位)。

你需要按照下面的规则在平面上移动:

  • 每一秒内,你可以:
    • 沿水平方向移动一个单位长度,或者
    • 沿竖直方向移动一个单位长度,或者
    • 跨过对角线移动 sqrt(2) 个单位长度(可以看作在一秒内向水平和竖直方向各移动一个单位长度)。
  • 必须按照数组中出现的顺序来访问这些点。
  • 在访问某个点时,可以经过该点后面出现的点,但经过的那些点不算作有效访问。

ET~I453KOZWR0UZCSZ@AFVW.png

输入:points = [[1,1],[3,4],[-1,0]]
输出:7
解释:一条最佳的访问路径是: [1,1] -> [2,2] -> [3,3] -> [3,4] -> [2,3] -> [1,2] -> [0,1] -> [-1,0][1,1][3,4] 需要 3 秒 
从 [3,4][-1,0] 需要 4 秒
一共需要 7

看完这道题目,你理解了它的意思不?有没有解题的思路?

后来我看题解的时候,解题思路涉及切比雪夫距离来求两坐标的距离公式,这个距离的核心思想就是距离的值为两坐标其x,y值相差的绝对值的最大值

代码

from typing import List
class Solution:

    def minTimeToVisitAllPoints(self, points: List[List[int]]) -> int:
        # 获取第一个坐标
        x0,y0 = points[0]
        ans = 0 # 计算需要的时间
        for i in range(1,len(points)):
            # 获取后面的坐标
            xi,yi = points[i]
            # 求两个坐标间的距离(切比雪夫距离公式)
            ans += max(abs(xi-x0),abs(yi-y0))
            # 获取前一个坐标
            x0,y0 = points[i]
        return ans
solution = Solution()
if __name__ == '__main__':
    points = [[1,1],[3,4],[-1,0]]
    print(solution.minTimeToVisitAllPoints(points))

心得

代码实现确实不难,难的是了不了解题目的意思,知不知道切比雪夫距离的核心思想。当你连题目都没看懂时,潜意识会觉得这题目很难,但是当我们认真分析题目时,会发现其实就是纸老虎而已。可能这道题对我们的代码编写能力不会有多少提高,但是我觉得这给了我一个警惕。因为在编写代码之前我们都要先分析需求,然后才用代码实现。当我们没看到题目的意思时,千万不要慌,冷静下来分析题目要求的意思,弄清楚题目的大意是编写代码之前至关重要的一步,如果这一步理解错了或者没有理解,代码功底再强也没用。