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 相等,则返回其中的最大值。
核心思路:
- 遍历数组,计算每个数字到 0 的距离(绝对值)
- 维护当前最小距离和对应的数字
- 当遇到距离更小的数字时,更新结果
- 当遇到距离相等的数字时,选择较大的数字
具体实现:
- 初始化结果为数组第一个元素
- 遍历数组,对于每个元素:
- 如果绝对值更小,直接更新结果
- 如果绝对值相等,选择较大的数字
- 可以用一个巧妙的判断:
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) | 只使用常数额外空间 |
相关题目
- . Find K Closest Elements (Medium)