概要
題目來源鏈接:https://leetcode-cn.com/problems/minimum-time-visiting-all-points/
難度:簡單
類型:數組
題目
平面上有 n 個點,點的位置用整數座標表示 points[i] = [xi, yi]。請你計算訪問所有這些點需要的最小時間(以秒爲單位)。
你可以按照下面的規則在平面上移動:
每一秒沿水平或者豎直方向移動一個單位長度,或者跨過對角線(可以看作在一秒內向水平和豎直方向各移動一個單位長度)。
必須按照數組中出現的順序來訪問這些點。
示例
示例1圖:
示例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
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/minimum-time-visiting-all-points
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。
分析
points = [[1,1],[3,4],[-1,0]]以此爲例
從 [1,1] 到 [3,4] 需要 3 秒,那麼這個3可以這麼計算出來呢?|1-3|的絕對值等於2,|1-4|的絕對值等於3,那麼取絕對值大的3即爲最小時間。
同理,從 [3,4] 到 [-1,0] 需要 4 秒,|3-(-1)|的絕對值等於4,|4-0|的絕對值也等於4,那麼任取一個4都可以。
然後3+4=7即爲最小時間。
代碼
/**
* 訪問所有點的最小時間
*
* @param points 結點數組
* @return 返回最小時間(以秒爲單位)
*/
public int minTimeToVisitAllPoints(int[][] points) {
int time = 0;// 計時器,記錄最小時間
for (int i = 0; i < points.length - 1; i++) {// 遍歷二維數組
for (int j = 0; j < points[i].length - 1; j++) {
int t1 = points[i][j] - points[i + 1][j];// 記錄二維數組第i行j列的元素減去第i+1行第j的元素的值
int t2 = points[i][j + 1] - points[i + 1][j + 1];// 記錄二維數組第i行j+1列的元素減去第i+1行第j+1的元素的值
if (abs(t1) > abs(t2)) {// 比較二者的絕對值,取絕對值大的作爲時間,如果相等,任取其一
time += abs(t1);
} else if (abs(t1) < abs(t2)) {
time += abs(t2);
} else if (abs(t1) == abs(t2)) {
time += abs(t1);
}
}
}
return time;
}
/**
* 求一個數的絕對值
* @param x 數
* @return 返回絕對值
*/
public int abs(int x) {
if (x < 0) {
return -x;
} else {
return x;
}
}