題目
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
分析
題意:給定n個點,按n個點出現的順序,將點(x,y)進行水平(x±1)、垂直(y±)或對角移動一個單位(x±1,y±1),求出遍歷n個點所需要的單位量。
初步分析算法:sum(max(( |x[i+1]-x[i]| ),( |y[i+1]-y[i]| ))),i∈(0,1,2…)
求出點i前後的x、y座標差的絕對值,取最大值,並將所有兩點求出的該最大值累加;
如:points = [[3,2],[-2,2]])
|3-(-2)|=5
|2-2|=0
因此result=max(5,0)=5
但是如果按上述方法,二維數組的操縱比較麻煩,我還是看看評論區答案。
發現評論區的算法跟上面所述算法一樣,博主對Java二維數組的操縱比較不熟悉,答案後面會對二維數組的操縱進行總結。
解答
class Solution {
public int minTimeToVisitAllPoints(int[][] points) {
int ans = 0;
for (int i = 1; i < points.length; ++i) {
int[] cur = points[i], prev = points[i - 1];
ans += Math.max(Math.abs(cur[0] - prev[0]), Math.abs(cur[1] - prev[1]));
}
return ans;
}
}
- points.length=第一維度的長度(即點的個數)
- points[i]是一個點,實際包含x,y兩個數據
- 然後訪問x點:cur[0],y點cur[1]