Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[LeetCode] 1266. Minimum Time Visiting All Points #1266

Open
grandyang opened this issue May 30, 2019 · 0 comments
Open

[LeetCode] 1266. Minimum Time Visiting All Points #1266

grandyang opened this issue May 30, 2019 · 0 comments

Comments

@grandyang
Copy link
Owner

grandyang commented May 30, 2019

On a 2D plane, there are n points with integer coordinates points[i] = [xi, yi]. Return *the minimum time in seconds to visit all the points in the order given by *points.

You can move according to these rules:

  • In 1 second, you can either:
    • move vertically by one unit,
    • move horizontally by one unit, or
    • move diagonally sqrt(2) units (in other words, move one unit vertically then one unit horizontally in 1 second).
  • You have to visit the points in the same order as they appear in the array.
  • You are allowed to pass through points that appear later in the order, but these do not count as visits.

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

这道题给了一堆二维平面上的点,让按照顺序去连接点,这里的连线不但可以走水平和竖直,还能走斜线,都算作一步,问按顺序连上所有的点需要多少步。这里让按顺序连点也就简单了不少,也算对得起 Easy 的身价,只要分析出两个点之间的最小步数怎么算就可以解题了。题目中说可以水平,竖直,和对角线走,那么就按照题目中的例子来分析吧,若仔细观察可以发现,假如两个点的横纵坐标的差值相等的话(都是绝对值),那么只要纯走对角线就行了,比如 [3,4][-1,0] 这两个点,若差值不相等的话,则同时要走对角线和横纵边,比如 [1,1][3,4] 这两个点,但是步数不会超过较长的那条边,想想是为啥?因为要达到目标点,横纵方向都要走完差值,走对角线可以同时走横纵方向,但要走的步数也绝不会小于较大的差值,不然的话在该方向没法走完之间的距离,同时也不应该大于较大的差值,否则走的就不是最优解的话。所以两个点之间的步数就是其横纵坐标各自的差的绝对值中的较大一个,两两之间计算一下,累加起来即为所求,参见代码如下:

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

Github 同步地址:

#1266

参考资料:

https://leetcode.com/problems/minimum-time-visiting-all-points/

https://leetcode.com/problems/minimum-time-visiting-all-points/discuss/436250/JavaPython-3-6-liner-and-1-liner-w-brief-explanation-and-analysis.

LeetCode All in One 题目讲解汇总(持续更新中...)

喜欢请点赞,疼爱请打赏❤️~.~

微信打赏

|

Venmo 打赏


---|---

@grandyang grandyang changed the title [LeetCode] 1266. Missing Problem [LeetCode] 1266. Minimum Time Visiting All Points Apr 15, 2022
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant