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

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

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

示例 1:

  1. 平面上有 n 个点,点的位置用整数坐标表示 points[i] = [xi, yi] 。请你计算访问所有这些点需要的 最小时间(以秒为单位)。
  2. 你需要按照下面的规则在平面上移动:
  3. 每一秒内,你可以:
  4. 沿水平方向移动一个单位长度,或者
  5. 沿竖直方向移动一个单位长度,或者
  6. 跨过对角线移动 sqrt(2) 个单位长度(可以看作在一秒内向水平和竖直方向各移动一个单位长度)。
  7. 必须按照数组中出现的顺序来访问这些点。
  8. 在访问某个点时,可以经过该点后面出现的点,但经过的那些点不算作有效访问。

题解

从题目的意思来讲, 其实就是数组中前后两个点的最大距离是多少, 可以看出,斜着走算为1,跟横线竖线是统一的距离,那么就能知道,两个点间的优先是斜着走,最后是较长边的走,又由于斜着走的时候,是X,Y都+1,所以两点间的距离其实就是他们X,Y的差值的最大值

  1. /**
  2. * @param {number[][]} points
  3. * @return {number}
  4. */
  5. var minTimeToVisitAllPoints = function(points) {
  6. let time = 0;
  7. let prePoint = [];
  8. for (point of points) {
  9. if (!prePoint.length) {
  10. prePoint = point;
  11. } else {
  12. const x = Math.abs(point[0] - prePoint[0]);
  13. const y = Math.abs(point[1] - prePoint[1]);
  14. time += x - y > 0 ? x : y;
  15. prePoint = point;
  16. }
  17. }
  18. return time;
  19. };