leetcode
leetcode 1951 ~ 2000
找到最接近 0 的数字

找到最接近 0 的数字

难度:

标签:

题目描述

代码结果

运行时间: 27 ms, 内存: 16.1 MB


/*
 * Problem: Given an integer array nums of length n, return the number in nums that is closest to 0. 
 * If there are multiple answers, return the largest number.
 *
 * Approach using Java Streams:
 * 1. Convert the array nums to a stream.
 * 2. Use the reduce function to find the number closest to 0.
 * 3. The reduce function compares two numbers based on their absolute values.
 * 4. If the absolute values are equal, the reduce function keeps the larger number.
 * 5. Return the result of the reduction.
 */
public int findClosestNumber(int[] nums) {
    return Arrays.stream(nums)
        .reduce((a, b) -> Math.abs(a) < Math.abs(b) ? a : Math.abs(a) == Math.abs(b) ? Math.max(a, b) : b)
        .orElse(0);
}

解释

方法:

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

时间复杂度:

O(n)

空间复杂度:

O(1)

代码细节讲解

🦆
为什么在判断条件中同时检查 abs(num) < closest 和 ans < num,而不是仅仅比较绝对值?
在这个算法中,我们首先要找到距离0最近的数,即绝对值最小的数。当有多个数的绝对值相同且都是最小时,题目要求返回其中最大的数。因此,我们需要在绝对值相等的情况下,通过比较 ans < num 来判断是否需要更新答案为当前更大的数。这样可以确保当绝对值相同时,返回的是最大的一个。
🦆
如果所有数字的绝对值都相等,此算法如何确保返回的是所有候选者中的最大值?
如果所有数字的绝对值都相等,那么变量 `closest` 将被设置为这个共同的最小绝对值。在遍历数组时,由于所有绝对值相同,每次比较 `ans < num` 都会发生。这将导致 `ans` 更新为遍历过程中遇到的最大数值。因此,算法最终确保返回的是所有候选中的最大值。
🦆
当变量 `closest` 的初始值设为无穷大时,这会对算法的性能或结果准确性有什么影响?
将 `closest` 的初始值设为无穷大是为了在算法开始时任何一个实际的数的绝对值都会小于它,从而保证第一个遍历到的数字能够正确设置初始的 `closest` 和 `ans` 值。这种做法不会影响算法的性能或结果的准确性,只是简化了逻辑,避免了需要处理特殊或初始条件的复杂代码。
🦆
在算法中,如果输入数组 `nums` 包含零,输出是否直接就是零,且是否可以提前终止遍历?
如果数组中包含零,由于零的绝对值是最小的,零会被即时更新为 `ans`。然而,当前算法不会在发现零时终止遍历,因为它需要遍历完整个数组以确保找到所有相同最小绝对值的最大数。如果优化算法以在找到零后立即停止,那么可以节约时间,但前提是题目明确不需要返回最大值或数组中不会有多个绝对值最小且相等的数。

相关问题