【Leetcode】1266. Minimum Time Visiting All Points

题目地址:

https://leetcode.com/problems/minimum-time-visiting-all-points/

给定二维网格中的若干个点,从每个点允许水平、竖直或沿对角线走一个单位,要求按顺序遍历这些点,问最少要走多少步。

比较显然的一点是,从一个点走到另一个点,最快的方法是尽量走对角线,走不了对角线的时候再走直线。那么从一个点到另一个点的最少步数应该如何求呢。
设两个点分别为 ( x 1 , y 1 ) , ( x 2 , y 2 ) (x_1,y_1),(x_2,y_2) 。我们可以证明,最少步数其实等于 max ( x 1 x 2 , y 1 y 2 ) \max(|x_1-x_2|, |y_1-y_2|) 。不妨考虑从 ( 0 , 0 ) (0,0) ( x , y ) (x,y) 的最少步数,假设 ( x , y ) (x,y) 位于第一象限,那么最少步数 s max ( x , y ) s\ge\max(x,y) ,否则的话无法在向右或者向上这个方向达到 ( x , y ) (x,y) 这个点。接着只需证明右边的最小步数可以到达即可。不妨设 x > y x>y ,那么只需这样走:先向右上走 y y 步,接着向右走 y x y-x 步,这样就走到了目的地。所以不等号右边可以取到。代码如下:

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);
    }
}

时间复杂度 O ( n ) O(n)

发布了354 篇原创文章 · 获赞 0 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_46105170/article/details/105235597