找到最接近 0 的数字

标签: 数组

难度: Easy

给你一个长度为 n 的整数数组 nums ,请你返回 nums 中最 接近 0 的数字。如果有多个答案,请你返回它们中的 最大值 。

示例 1:

输入:nums = [-4,-2,1,4,8]
输出:1
解释:
-4 到 0 的距离为 |-4| = 4 。
-2 到 0 的距离为 |-2| = 2 。
1 到 0 的距离为 |1| = 1 。
4 到 0 的距离为 |4| = 4 。
8 到 0 的距离为 |8| = 8 。
所以,数组中距离 0 最近的数字为 1 。

示例 2:

输入:nums = [2,-1,1]
输出:1
解释:1 和 -1 都是距离 0 最近的数字,所以返回较大值 1 。

提示:

  • 1 <= n <= 1000
  • -105 <= nums[i] <= 105

Submission

运行时间: 27 ms

内存: 16.1 MB

class Solution:
    def findClosestNumber(self, nums: List[int]) -> int:
        ans = -1
        closest = inf
        for num in nums:
            if abs(num) < closest or (ans < num and abs(num) == closest):
                closest = abs(num)
                ans = num
        return ans

Explain

该题解的思路是遍历整数数组 `nums`,寻找与 0 的绝对值距离最小的数字。初始化一个变量 `closest` 为无穷大,用来记录当前找到的最小的绝对距离,以及一个变量 `ans` 来存储这个距离对应的数字值。对于每个数字 `num`,如果 `num` 的绝对值小于 `closest`,则更新 `closest` 和 `ans`。如果 `num` 的绝对值等于当前的 `closest` 但 `num` 比 `ans` 大,则更新 `ans` 以确保在距离相同的情况下返回较大的数。

时间复杂度: O(n)

空间复杂度: O(1)

class Solution:
    def findClosestNumber(self, nums: List[int]) -> int:
        ans = -1  # 初始化一个可能的最大值
        closest = inf  # 初始最小距离设为无穷大
        for num in nums:  # 遍历数组
            if abs(num) < closest or (ans < num and abs(num) == closest):
                # 如果当前数的绝对值小于已知最小距离,或者绝对值相等但当前数更大
                closest = abs(num)  # 更新最小距离
                ans = num  # 更新结果
        return ans  # 返回最接近0的数

Explore

在这个算法中,我们首先要找到距离0最近的数,即绝对值最小的数。当有多个数的绝对值相同且都是最小时,题目要求返回其中最大的数。因此,我们需要在绝对值相等的情况下,通过比较 ans < num 来判断是否需要更新答案为当前更大的数。这样可以确保当绝对值相同时,返回的是最大的一个。

如果所有数字的绝对值都相等,那么变量 `closest` 将被设置为这个共同的最小绝对值。在遍历数组时,由于所有绝对值相同,每次比较 `ans < num` 都会发生。这将导致 `ans` 更新为遍历过程中遇到的最大数值。因此,算法最终确保返回的是所有候选中的最大值。

将 `closest` 的初始值设为无穷大是为了在算法开始时任何一个实际的数的绝对值都会小于它,从而保证第一个遍历到的数字能够正确设置初始的 `closest` 和 `ans` 值。这种做法不会影响算法的性能或结果的准确性,只是简化了逻辑,避免了需要处理特殊或初始条件的复杂代码。

如果数组中包含零,由于零的绝对值是最小的,零会被即时更新为 `ans`。然而,当前算法不会在发现零时终止遍历,因为它需要遍历完整个数组以确保找到所有相同最小绝对值的最大数。如果优化算法以在找到零后立即停止,那么可以节约时间,但前提是题目明确不需要返回最大值或数组中不会有多个绝对值最小且相等的数。