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