题记
最近学完python的基本语法,想巩固下python基础,于是开始在leetCode上刷一些easy的题目,最开始是刷数组方面的题目(数组方面的easy题一般比较简单)。直到今天,我刷到了这道题1266.访问所有点的最小时间,题目看了两三遍才看懂题目的意思但是想了10分钟左右还是没有解题思路,于是看了该题目的题解,发现这题目有点意思,难度不在解题而在于解题的思路。
题目
1266. 访问所有点的最小时间
描述:
平面上有 n 个点,点的位置用整数坐标表示 points[i] = [xi, yi] 。请你计算访问所有这些点需要的 最小时间(以秒为单位)。
你需要按照下面的规则在平面上移动:
- 每一秒内,你可以:
- 沿水平方向移动一个单位长度,或者
- 沿竖直方向移动一个单位长度,或者
- 跨过对角线移动 sqrt(2) 个单位长度(可以看作在一秒内向水平和竖直方向各移动一个单位长度)。
- 必须按照数组中出现的顺序来访问这些点。
- 在访问某个点时,可以经过该点后面出现的点,但经过的那些点不算作有效访问。
输入: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))
心得
代码实现确实不难,难的是了不了解题目的意思,知不知道切比雪夫距离的核心思想。当你连题目都没看懂时,潜意识会觉得这题目很难,但是当我们认真分析题目时,会发现其实就是纸老虎而已。可能这道题对我们的代码编写能力不会有多少提高,但是我觉得这给了我一个警惕。因为在编写代码之前我们都要先分析需求,然后才用代码实现。当我们没看到题目的意思时,千万不要慌,冷静下来分析题目要求的意思,弄清楚题目的大意是编写代码之前至关重要的一步,如果这一步理解错了或者没有理解,代码功底再强也没用。