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
  • -10^5 <= nums[i] <= 10^5

解题思路

解题思路

这道题要求找到数组中最接近 0 的数字,如果有多个数字距离 0 相等,则返回其中的最大值。

核心思路:

  1. 遍历数组,计算每个数字到 0 的距离(绝对值)
  2. 维护当前最小距离和对应的数字
  3. 当遇到距离更小的数字时,更新结果
  4. 当遇到距离相等的数字时,选择较大的数字

具体实现:

  • 初始化结果为数组第一个元素
  • 遍历数组,对于每个元素:
    • 如果绝对值更小,直接更新结果
    • 如果绝对值相等,选择较大的数字
    • 可以用一个巧妙的判断:abs(num) < abs(result) || (abs(num) == abs(result) && num > result)

这种方法只需要一次遍历,时间复杂度为 O(n),空间复杂度为 O(1)。

代码实现

class Solution {
public:
    int findClosestNumber(vector<int>& nums) {
        int result = nums[0];
        for (int num : nums) {
            if (abs(num) < abs(result) || (abs(num) == abs(result) && num > result)) {
                result = num;
            }
        }
        return result;
    }
};
class Solution:
    def findClosestNumber(self, nums: List[int]) -> int:
        result = nums[0]
        for num in nums:
            if abs(num) < abs(result) or (abs(num) == abs(result) and num > result):
                result = num
        return result
public class Solution {
    public int FindClosestNumber(int[] nums) {
        int result = nums[0];
        foreach (int num in nums) {
            if (Math.Abs(num) < Math.Abs(result) || (Math.Abs(num) == Math.Abs(result) && num > result)) {
                result = num;
            }
        }
        return result;
    }
}
/**
 * @param {number[]} nums
 * @return {number}
 */
var findClosestNumber = function(nums) {
    let closest = nums[0];
    
    for (let i = 1; i < nums.length; i++) {
        if (Math.abs(nums[i]) < Math.abs(closest) || 
            (Math.abs(nums[i]) === Math.abs(closest) && nums[i] > closest)) {
            closest = nums[i];
        }
    }
    
    return closest;
};

复杂度分析

复杂度类型复杂度说明
时间复杂度O(n)需要遍历数组一次,n 为数组长度
空间复杂度O(1)只使用常数额外空间

相关题目