「模拟」找到最近的有相同 X 或 Y 坐标的点(力扣第1779题)

本题为12月1日力扣每日一题

题目来源:力扣第1779题

题目tag:模拟

题面

题目描述

给你两个整数 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 <= $ 10^4 $
points[i].length == 2
1 <= x, y, ai, bi <= $ 10^4 $


思路分析

很简单的一道模拟题,直接按照题意做就行.

参考代码

class Solution
{
public:
    int nearestValidPoint(int x, int y, vector<vector<int>> &points)
    {
        int res = -1, minLen = 0x3f3f3f3f; // 存放最大距离点的下标和最大距离
        for (int i = 0; i < points.size(); i++)
        {
            if (points[i][0] == x && minLen > fabs(points[i][1] - y)) // x坐标相同且距离更小
            {
                // 更新两个数据
                res = i;
                minLen = fabs(points[i][1] - y);
            }
            else if (points[i][1] == y && minLen > fabs(points[i][0] - x)) // y坐标相同且距离更小
            {
                // 更新两个数据
                res = i;
                minLen = fabs(points[i][0] - x);
            }
        }
        return res;
    }
};

"正是我们每天反复做的事情,最终造就了我们,优秀不是一种行为,而是一种习惯" ---亚里士多德

posted @ 2022-12-01 17:28  星双子  阅读(43)  评论(0编辑  收藏  举报