平面上有 n 个点,点的位置用整数坐标表示 points[i] = [xi, yi] 。请你计算访问所有这些点需要的 最小时间(以秒为单位)。
你需要按照下面的规则在平面上移动:
每一秒内,你可以:
沿水平方向移动一个单位长度,或者
沿竖直方向移动一个单位长度,或者
跨过对角线移动 sqrt(2) 个单位长度(可以看作在一秒内向水平和竖直方向各移动一个单位长度)。
必须按照数组中出现的顺序来访问这些点。
在访问某个点时,可以经过该点后面出现的点,但经过的那些点不算作有效访问。
示例 1:
平面上有 n 个点,点的位置用整数坐标表示 points[i] = [xi, yi] 。请你计算访问所有这些点需要的 最小时间(以秒为单位)。你需要按照下面的规则在平面上移动:每一秒内,你可以:沿水平方向移动一个单位长度,或者沿竖直方向移动一个单位长度,或者跨过对角线移动 sqrt(2) 个单位长度(可以看作在一秒内向水平和竖直方向各移动一个单位长度)。必须按照数组中出现的顺序来访问这些点。在访问某个点时,可以经过该点后面出现的点,但经过的那些点不算作有效访问。
题解
从题目的意思来讲, 其实就是数组中前后两个点的最大距离是多少, 可以看出,斜着走算为1,跟横线竖线是统一的距离,那么就能知道,两个点间的优先是斜着走,最后是较长边的走,又由于斜着走的时候,是X,Y都+1,所以两点间的距离其实就是他们X,Y的差值的最大值
/*** @param {number[][]} points* @return {number}*/var minTimeToVisitAllPoints = function(points) {let time = 0;let prePoint = [];for (point of points) {if (!prePoint.length) {prePoint = point;} else {const x = Math.abs(point[0] - prePoint[0]);const y = Math.abs(point[1] - prePoint[1]);time += x - y > 0 ? x : y;prePoint = point;}}return time;};
