X

LEETCODE 1266. Minimum Time Visiting All Points 解题思路分析

题目大意:

访问所有点的最小时间

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

你可以按照下面的规则在平面上移动:

  • 每一秒沿水平或者竖直方向移动一个单位长度,或者跨过对角线(可以看作在一秒内向水平和竖直方向各移动一个单位长度)。
  • 必须按照数组中出现的顺序来访问这些点。

示例 1:

输入: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 秒

示例 2:

输入:points = [[3,2],[-2,2]]
输出:5

提示:

  • points.length == n
  • 1 <= n <= 100
  • points[i].length == 2
  • -1000 <= points[i][0], points[i][1] <= 1000

如果想查看本题目是哪家公司的面试题,请参考以下免费链接: https://leetcode.jp/problemdetail.php?id=1266

解题思路分析:

我们知道,两点之间的直线距离最短,在本题中,我们只能沿着每个格子的边或者对角线移动,因为对角线移动的效率最高,因此我们应该优先对角线移动(对角线移动一步相当于x和y个移动一次),剩下的部分再做边移动即可。

比如我们想从(1,1)移动到(4,5),我们可以先对角线移动3步到(4,4),这时,相当于x移动了3,y移动了3。然后再y方向移动1步到(4,5),y移动了1。总共花费4步,即x总共移动3,y总共移动4。我们发现,最后的结果应是,x和y所需要移动的最大值即是两点间的最短距离。

根据上面的思路,循环遍历所有两点之间的最短距离,求和即是结果。

实现代码:

public int minTimeToVisitAllPoints(int[][] points) {
    int res=0; // 返回结果
    for(int i=1;i<points.length;i++){
        // 两点x方向间的距离
        int disX = Math.abs(points[i][0]-points[i-1][0]);
        // 两点y方向间的距离
        int disY = Math.abs(points[i][1]-points[i-1][1]);
        // x和y的最大距离为两点间最短路径,将其加入结果
        res+=Math.max(disX,disY);
    }
    return res;
}

本题解法执行时间为1ms。

Runtime: 1 ms, faster than 80.69% of Java online submissions for Minimum Time Visiting All Points.

Memory Usage: 42.2 MB, less than 100.00% of Java online submissions for Minimum Time Visiting All Points.

本网站文章均为原创内容,并可随意转载,但请标明本文链接
如有任何疑问可在文章底部留言。为了防止恶意评论,本博客现已开启留言审核功能。但是博主会在后台第一时间看到您的留言,并会在第一时间对您的留言进行回复!欢迎交流!
本文链接: http://leetcode.jp/leetcode-1266-minimum-time-visiting-all-points-解题思路分析/
Categories: leetcode
kwantong: