给你两个整数 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)
。
示例 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:
**输入:** x = 3, y = 4, points = [[3,4]]
**输出:** 0
**提示:** 答案可以与你当前所在位置坐标相同。
示例 3:
**输入:** x = 3, y = 4, points = [[2,3]]
**输出:** -1
**解释:** 没有 有效点。
提示:
1 <= points.length <= 104
points[i].length == 2
1 <= x, y, ai, bi <= 104
方法一:枚举所有的点 思路与算法
我们可以枚举数组 points 中所有的点并计算出答案。
当我们枚举到点 (\textit{px}, \textit{py}),如果 x=\textit{px,那么这两个点有相同的 x 坐标,我们可以用距离 |y - \textit{py}| 更新答案;如果 y=\textit{py,那么这两个点有相同的 y 坐标,我们可以用距离 |x - \textit{px}| 更新答案。
题目要求返回下标最小 的一个最近有效点,我们只需要按照数据枚举点,在距离严格变小时才选择更新答案即可。
代码
[sol1-C++] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 class Solution {public : int nearestValidPoint (int x, int y, vector<vector<int >>& points) { int n = points.size (); int best = numeric_limits<int >::max (), bestid = -1 ; for (int i = 0 ; i < n; ++i) { int px = points[i][0 ], py = points[i][1 ]; if (x == px) { if (int dist = abs (y - py); dist < best) { best = dist; bestid = i; } } else if (y == py) { if (int dist = abs (x - px); dist < best) { best = dist; bestid = i; } } } return bestid; } };
[sol1-Java] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 class Solution { public int nearestValidPoint (int x, int y, int [][] points) { int n = points.length; int best = Integer.MAX_VALUE, bestid = -1 ; for (int i = 0 ; i < n; ++i) { int px = points[i][0 ], py = points[i][1 ]; if (x == px) { int dist = Math.abs(y - py); if (dist < best) { best = dist; bestid = i; } } else if (y == py) { int dist = Math.abs(x - px); if (dist < best) { best = dist; bestid = i; } } } return bestid; } }
[sol1-C#] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 public class Solution { public int NearestValidPoint (int x, int y, int [][] points ) { int n = points.Length; int best = int .MaxValue, bestid = -1 ; for (int i = 0 ; i < n; ++i) { int px = points[i][0 ], py = points[i][1 ]; if (x == px) { int dist = Math.Abs(y - py); if (dist < best) { best = dist; bestid = i; } } else if (y == py) { int dist = Math.Abs(x - px); if (dist < best) { best = dist; bestid = i; } } } return bestid; } }
[sol1-Python3] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 class Solution : def nearestValidPoint (self, x: int , y: int , points: List [List [int ]] ) -> int : n = len (points) best, bestid = float ("inf" ), -1 for i, (px, py) in enumerate (points): if x == px: if (dist := abs (y - py)) < best: best = dist bestid = i elif y == py: if (dist := abs (x - px)) < best: best = dist bestid = i return bestid
[sol1-C] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 int nearestValidPoint (int x, int y, int ** points, int pointsSize, int * pointsColSize) { int best = INT_MAX, bestid = -1 ; for (int i = 0 ; i < pointsSize; ++i) { int px = points[i][0 ], py = points[i][1 ]; if (x == px) { int dist = abs (y - py); if (dist < best) { best = dist; bestid = i; } } else if (y == py) { int dist = abs (x - px); if (dist < best) { best = dist; bestid = i; } } } return bestid; }
[sol1-JavaScript] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 var nearestValidPoint = function (x, y, points ) { const n = points.length ; let best = Number .MAX_VALUE , bestid = -1 ; for (let i = 0 ; i < n; ++i) { const px = points[i][0 ], py = points[i][1 ]; if (x === px) { const dist = Math .abs (y - py); if (dist < best) { best = dist; bestid = i; } } else if (y === py) { const dist = Math .abs (x - px); if (dist < best) { best = dist; bestid = i; } } } return bestid; };
[sol1-Golang] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 func nearestValidPoint (x, y int , points [][]int ) int { ans := -1 minDist := math.MaxInt32 for i, p := range points { if p[0 ] == x || p[1 ] == y { dist := abs(p[0 ]-x) + abs(p[1 ]-y) if dist < minDist { minDist = dist ans = i } } } return ans } func abs (x int ) int { if x < 0 { return -x } return x }
复杂度分析