一、題目
給你兩個整數 x
和 y
,表示你在一個笛卡爾坐標系下的 (x, y)
處。同時,在同一個坐標系下給你一個數組 points
,其中 points[i] = [ai, bi]
表示在 (ai, bi)
處有一個點。當一個點與你所在的位置有相同的 x
坐標或者相同的 y
坐標時,我們稱這個點是 有效的 。
請返回距離你當前位置 曼哈頓距離 最近的 有效 點的下標(下標從 0 開始)。如果有多個最近的有效點,請返回下標 最小 的一個。如果沒有有效點,請返回 -1
。
兩個點 (x1, y1)
和 (x2, y2)
之間的 曼哈頓距離 為 abs(x1 - x2) + abs(y1 - y2)
。
二、示例
2.1> 示例 1:
【輸入】x = 3, y = 4, points = [[1,2],[3,1],[2,4],[2,3],[4,4]]
【輸出】2
【解釋】所有點中,[3,1],[2,4] 和 [4,4] 是有效點。有效點中,[2,4] 和 [4,4] 距離你當前位置的曼哈頓距離最小,都為 1 。[2,4] 的下標最小,所以返回 2 。
2.2> 示例 2:
【輸入】x = 3, y = 4, points = [[3,4]]
【輸出】0
【提示】答案可以與你當前所在位置坐標相同。
2.3> 示例 3:
【輸入】x = 3, y = 4, points = [[2,3]]
【輸出】-1
【解釋】沒有 有效點。
提示:
-
1
<= points.length <=10^4
- points[i].length ==
2
-
1
<= x, y, ai, bi <=10^4
三、解題思路
根據題目描述,我們只需要通過如下4個步驟,即可獲得最終結果:
【步驟1】過濾掉
point[i][0]不等于x
并且point[i][1]不等于y
的point。
【步驟2】通過公式abs(x1 - x2) + abs(y1 - y2)
計算曼哈頓距離dist。
【步驟3】如果發現dist
是目前最短距離,則更新min=dist
,result=i
;
【步驟4】遍歷完所有points
之后,result
值就是最終結果。
由于本題只需要根據題目描述模擬處理邏輯即可,所以就不再畫圖了。
四、代碼實現
class Solution {
public int nearestValidPoint(int x, int y, int[][] points) {
int result = -1;
for (int i = 0, min = Integer.MAX_VALUE; i < points.length; i++) {
if (x != points[i][0] && y != points[i][1]) continue;
int dist = Math.abs(x - points[i][0]) + Math.abs(y - points[i][1]);
if (min > dist) {
min = dist;
result = i;
}
}
return result;
}
}
今天的文章內容就這些了:
寫作不易,筆者幾個小時甚至數天完成的一篇文章,只愿換來您幾秒鐘的 點贊 & 分享 。
更多技術干貨,歡迎大家關注公眾號“爪哇繆斯” ~ \(o)/ ~ 「干貨分享,每天更新」