题目地址:
https://leetcode.com/problems/minimum-time-visiting-all-points/
给定二维网格中的若干个点,从每个点允许水平、竖直或沿对角线走一个单位,要求按顺序遍历这些点,问最少要走多少步。
比较显然的一点是,从一个点走到另一个点,最快的方法是尽量走对角线,走不了对角线的时候再走直线。那么从一个点到另一个点的最少步数应该如何求呢。
设两个点分别为
。我们可以证明,最少步数其实等于
。不妨考虑从
到
的最少步数,假设
位于第一象限,那么最少步数
,否则的话无法在向右或者向上这个方向达到
这个点。接着只需证明右边的最小步数可以到达即可。不妨设
,那么只需这样走:先向右上走
步,接着向右走
步,这样就走到了目的地。所以不等号右边可以取到。代码如下:
public class Solution {
public int minTimeToVisitAllPoints(int[][] points) {
if (points == null || points.length == 0) {
return 0;
}
int res = 0;
for (int i = 0; i < points.length - 1; i++) {
res += timeCons(points[i], points[i + 1]);
}
return res;
}
private int timeCons(int[] p1, int[] p2) {
int dx = Math.abs(p1[0] - p2[0]);
int dy = Math.abs(p1[1] - p2[1]);
return Math.max(dx, dy);
}
}
时间复杂度 。