浅谈 顺序访问所有点的最小时间 问题

顺序访问所有点的最小时间

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

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

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

例:
在这里插入图片描述

思路:
切比雪夫距离
对于平面上的两个点 x = (x0, x1) 和 y = (y0, y1),设它们横坐标距离之差为 dx = |x0 - y0|,纵坐标距离之差为 dy = |x1 - y1|,对于以下三种情况,我们可以分别计算出从 x 移动到 y 的最少次数:

  • dx < dy:沿对角线移动 dx 次,再竖直移动 dy - dx 次,总计 dx + (dy - dx) = dy 次;
  • dx == dy:沿对角线移动 dx 次;
  • dx > dy:沿对角线移动 dy 次,再水平移动 dx - dy 次,总计 dy + (dx - dy) = dx 次。

可以发现,对于任意一种情况,从 x 移动到 y 的最少次数为 dx 和 dy 中的较大值 max(dx, dy),这也被称作 x 和 y 之间的 切比雪夫距离

由于题目要求,需要按照数组中出现的顺序来访问这些点。因此我们遍历整个数组,对于数组中的相邻两个点,计算出它们的切比雪夫距离,所有的距离之和即为答案。

class Solution {
    
    
public:
    int minTimeToVisitAllPoints(const vector<vector<int>>& points) {
    
    
        auto distance = 0;
        auto count = points.size() - 1;
        for(int i = 0; i < count; ++i) {
    
    
            auto delt_x = abs(points[i + 1][0] - points[i][0]);
            auto delt_y = abs(points[i + 1][1] - points[i][1]);
            distance += max(delt_x, delt_y);
        }
        return distance;
    }
};

猜你喜欢

转载自blog.csdn.net/weixin_48033173/article/details/113079059
今日推荐