算法日志 --- 12.01---找到最近的有相同 X 或 Y 坐标的点

80 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第11天,点击查看活动详情

死亡周四,要单独部署了,全面解封了

找到最近的有相同 X 或 Y 坐标的点

该题出自力扣的1779题 —— 找到最近的有相同 X 或 Y 坐标的点【简单题】,又是简单题,重拳出击!!!

审题

给你两个整数 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) 。

  • 这道题因为是简单题,基本上把解法都写在题目里面了,只需要把相关解法解析成编程语言即可
    • 给出两个变量,x、y代表坐标轴的两个变量
    • 给出一个二维数组,里面存储着一对对的坐标
    • 找出有效坐标的前提下:x坐标或者y坐标相等时,曼哈顿距离最小的值
      • 公式也给了: 两个坐标的绝对值差
  • 如果有多个最小,那么返回最小坐标的那位
  • 那就很好理解了,遍历整个二维数组,那就能解决返回最小坐标的问题
  • 利用函数Math.abs计算曼哈顿的距离,只有大于的时候才能覆盖值,那最后就能返回第一个最小的下标

编码

class Solution {
    public int nearestValidPoint(int x, int y, int[][] points) {
        int result = Integer.MAX_VALUE;
        int index = -1;
        for (int i = 0;i<points.length;i++) {
            int[] a = points[i];
            if (a[0] == x || a[1] == y){
                int j = Math.abs(x - a[0]) + Math.abs(y - a[1]);
                if (result > j){
                    result = j;
                    index = i;
                }
            }
        }
        return index;
    }
}

image.png