LeetCode 1266. Minimum Time Visiting All Points (Easy)

Description:
On a plane there are n points with integer coordinates points[i] = [xi, yi]. Your task is to find the minimum time in seconds to visit all points.

You can move according to the next rules:

  • In one second always you can either move vertically, horizontally by one unit or diagonally (it means to move one unit vertically and one unit horizontally in one second).
  • You have to visit the points in the same order as they appear in the array.

Example 1:
在这里插入图片描述

Input: points = [[1,1],[3,4],[-1,0]]
Output: 7
Explanation: One optimal path is [1,1] -> [2,2] -> [3,3] -> [3,4] -> [2,3] -> [1,2] -> [0,1] -> [-1,0]   
Time from [1,1] to [3,4] = 3 seconds 
Time from [3,4] to [-1,0] = 4 seconds
Total time = 7 seconds

Example 2:

Input: points = [[3,2],[-2,2]]
Output: 5

Constraints:

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

Analysis:
两种方法:

  1. 先走斜线,直到到达一个横坐标或纵坐标与终点相同的点,然后开始走直线。
  2. 先走直线,直到到达一个可以通过走斜线到达终点的点,然后开始走斜线。

两种方法等价,但是从编程角度出发,第一种方法更容易实现。

方法1具体步骤:

  1. 先走斜线,这一步走的距离 d i a g D i s t a n c e = a b s ( x s t a r t − x e n d ) + a b s ( y e n d − y e n d ) diagDistance = abs(x_{start} - x_{end}) + abs(y_{end} - y_{end}) diagDistance=abs(xstartxend)+abs(yendyend)
  2. 再走直线,需要注意的是,此时当前点与终点在x方向与y方向上的距离,相比于起点,都减少了 d i a g D i s t a n c e diagDistance diagDistance。所以这一步走的距离 d i s t a n c e = ( a b s ( x s t a r t − x e n d ) − d i a g D i s t a n c e ) + ( a b s ( y s t a r t − y e n d ) − d i a g D i s t a n c e ) distance = (abs(x_{start} - x_{end}) - diagDistance) + (abs(y_{start} - y_{end}) - diagDistance) distance=(abs(xstartxend)diagDistance)+(abs(ystartyend)diagDistance)

Code:

class Solution {
    public int minTimeToVisitAllPoints(int[][] points) {
        int distances = 0;
        for(int i = 0; i < points.length-1; i++) {
            int distance = calc(points[i], points[i+1]);
            distances += distance;
        }
        
        return distances;
    }
    
    public int calc(int[] pointX, int[] pointY) {
        int diagDistance = Math.min(Math.abs(pointX[0] - pointY[0]), Math.abs(pointX[1] - pointY[1]));
        int distance = diagDistance + (Math.abs(pointX[0] - pointY[0]) - diagDistance) + (Math.abs(pointX[1] - pointY[1]) - diagDistance);
        
        return distance;
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值