zoukankan      html  css  js  c++  java
  • LeetCode 1266 访问所有点的最小时间 Minimum Time Visiting All Points

    地址 https://leetcode-cn.com/problems/minimum-time-visiting-all-points/submissions/

    题目描述
    平面上有 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

    算法1
    若两点不在一条直线上 优先走斜线是最优的 同时减少横向和竖向的距离
    走斜线意味着横向竖向同时增加相同单位
    所以也意味着 走横向和竖向之差中 较小的值(走斜向)
    然后再走横向和竖向之差中两个值得差(表示走竖向或者走横向)

    C++ 代码

    class Solution {
    public:
        int minTimeToVisitAllPoints(vector<vector<int>>& points) {
            int sum = 0;
            for(int i = 0; i < points.size()-1;i++){
                int xx =  abs(points[i][0] - points[i+1][0]);
                int yy =  abs(points[i][1] - points[i+1][1]);
                sum += min(xx,yy);
                sum += max(xx,yy) - min(xx,yy);
            }   
    
            return sum;
        }
    };

    作 者: itdef
    欢迎转帖 请保持文本完整并注明出处
    技术博客 http://www.cnblogs.com/itdef/
    B站算法视频题解
    https://space.bilibili.com/18508846
    qq 151435887
    gitee https://gitee.com/def/
    欢迎c c++ 算法爱好者 windows驱动爱好者 服务器程序员沟通交流
    如果觉得不错,欢迎点赞,你的鼓励就是我的动力
    阿里打赏 微信打赏
  • 相关阅读:
    多态的使用
    抽象类与具体类
    对象应该长什么样子
    方法的重载overload
    遵守合约:覆盖的规则
    Android 自定义Dialog
    less 之Extend 及 Extend all用法
    github常见错误整理!
    js获取元素宽高
    解决 Error: Access denied for user 'root'@'localhost' (using password: YES)
  • 原文地址:https://www.cnblogs.com/itdef/p/11922533.html
Copyright © 2011-2022 走看看