leetcode菜雞鬥智鬥勇系列(7)--- 用最小的時間訪問全部的節點

1.原題:

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

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.app

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 arra

翻譯:給定一個平面,有n個點,座標表示爲 [xi,yi],你須要求出一個最小的訪問時間,你的訪問方式必須是以順序去訪問全部的點。每一秒鐘你能夠水平或者垂直移動一步或者對角移動一步。spa

 

此圖就是原題的一個示例:翻譯

Input : points = [[1,1],[3,4],[-1,0]]code

output :7 leetcode

由於 :[1,1] -> [2,2] -> [3,3] -> [3,4] -> [2,3] -> [1,2] -> [0,1] -> [-1,0]get

 

2.解題思路:

這種簡單的最小路徑的算法題,思路有不少,最簡單的就是貪心算法,由於最無腦。it

咱們都知道,對角的一步比水平或者垂直移動的一步都要遠,因此咱們要儘可能先走對角,而後實在沒有辦法的時候再普通的走一步。io

那麼算法就很明瞭了:

 

class Solution {
public:
int minTimeToVisitAllPoints(vector<vector<int>>& points) {  
int ans = 0;   //距離的絕對值
for(int i = 1; i < points.size(); i++) {   
ans += max(abs(points[i][1] - points[i - 1][1]), abs(points[i][0] - points[i - 1][0]));    //求出發點和目的點的xy值的差,好比例子裏,x爲3-1=2,y爲4-1=3。這兩個值相同的部分(2) 就是對角的步數,多出來的(1)就是水平或者垂直的移動,所以咱們取二者的最大值3,是本次的距離。
}
return ans;
}
};

 

sub:這裏要注意就是 「points.size()」 這個是vector的一個成員函數 .size()其返回的是unsighed int,因此注意不要越界。

相關文章
相關標籤/搜索