【LeetCode 每日一题】3516. 找到最近的人
Problem: 3516. 找到最近的人
文章目录
- 整体思路
- 完整代码
- 时空复杂度
- 时间复杂度:O(1)
- 空间复杂度:O(1)
整体思路
这段代码的目的是在一个非常简单的场景下解决一个“找最近点”的问题。给定三个整数 x
, y
, 和 z
,它需要判断 x
和 y
中哪一个离 z
更近。如果它们距离 z
一样近,则有一个特殊的返回值。
该算法的思路非常直接,是一种纯粹的 计算与比较 方法,没有任何复杂的循环或数据结构。
-
计算距离:
- 算法首先分别计算
x
到z
的距离和y
到z
的距离。 - 为了处理正负数的情况(例如
x=5, z=10
和x=15, z=10
的距离都是5),代码使用了Math.abs()
函数来取绝对值。 int one = Math.abs(x - z);
计算x
和z
之间的距离。int two = Math.abs(y - z);
计算y
和z
之间的距离。
- 算法首先分别计算
-
比较距离并确定返回值:
- 在计算出两个距离
one
和two
之后,代码使用了一个嵌套的三元运算符来进行多路分支判断,以确定最终的返回值。 - 情况一:距离相等
one == two ? ...
:首先检查两个距离是否相等。- 如果
one == two
为true
,则直接返回0
。这对应题目中的特殊规则:如果x
和y
离z
的距离相等,则返回0
。
- 情况二:距离不相等
- 如果
one == two
为false
,则执行冒号后面的部分one < two ? 1 : 2
。 - 子情况 A:
x
更近one < two ? 1 : ...
:判断x
到z
的距离是否小于y
到z
的距离。- 如果
one < two
为true
,说明x
更近,返回1
。
- 子情况 B:
y
更近- 如果
one < two
为false
,说明y
更近(因为前面已经排除了相等的情况),返回2
。
- 如果
- 如果
- 在计算出两个距离
完整代码
class Solution {/*** 判断 x 和 y 哪个离 z 更近。* @param x 第一个整数* @param y 第二个整数* @param z 参考整数* @return 如果 x 和 y 距离 z 相等,返回 0。* 如果 x 比 y 更近,返回 1。* 如果 y 比 x 更近,返回 2。*/public int findClosest(int x, int y, int z) {// 步骤 1: 计算 x 到 z 的距离int one = Math.abs(x - z);// 步骤 2: 计算 y 到 z 的距离int two = Math.abs(y - z);// 步骤 3: 使用嵌套的三元运算符比较距离并返回结果// 首先判断距离是否相等return one == two ? 0 : // 如果不相等,再判断哪个更小(one < two ? 1 : 2);}
}
时空复杂度
时间复杂度:O(1)
- 操作分析:
- 代码中执行的所有操作都是基本的:两次减法、两次
Math.abs()
调用、一次相等比较、一次小于比较,以及一次三元运算。 - 这些操作的执行时间是固定的,不依赖于输入
x
,y
,z
的具体数值大小(在整数表示范围内)。
- 代码中执行的所有操作都是基本的:两次减法、两次
综合分析:
算法的执行时间是一个常数。因此,其时间复杂度为 O(1)。
空间复杂度:O(1)
- 存储分析:
- 算法在执行过程中只使用了两个额外的整型变量
one
和two
来存储中间计算结果。 - 这些变量的数量是固定的,不随任何输入的变化而改变。
- 算法在执行过程中只使用了两个额外的整型变量
综合分析:
算法没有使用任何与输入规模成比例的额外数据结构。因此,其额外辅助空间复杂度为 O(1)。