系列文章目录
【拒绝算法PUA】0x00-位运算
【拒绝算法PUA】0x01- 区间比较技巧
【拒绝算法PUA】0x02- 区间合并技巧
【拒绝算法PUA】0x03 - LeetCode 排序类型刷题
【拒绝算法PUA】LeetCode每日一题系列刷题汇总-2025年持续刷新中
C++刷题技巧总结:
[温习C/C++]0x04 刷题基础编码技巧
LeetCode 2239. 找到最接近 0 的数字
链接
题目
给你一个长度为 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
解题方法 (vector自定义排序法)
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
class Solution {
public:
int findClosestNumber(vector<int>& nums) {
int ans;
vector<pair<int, int>> vec; // {数字绝对值, 数字}
for (auto& n : nums) {
vec.emplace_back(abs(n), n);
}
// 先按照绝对值从小到大排序, 如果绝对值相等, 再按照数字从大到小排序
std::sort(vec.begin(), vec.end(), [&vec](const pair<int, int>& a, const pair<int, int>& b) {
if (a.first == b.first) {
return a.second > b.second;
}
return a.first < b.first;
});
ans = vec[0].second;
return ans;
}
};
int main(int argc, char **argv) {
Solution obj;
vector<int> nums1 = {-4, -2, 1, 4, 8};
int ret1 = obj.findClosestNumber(nums1);
cout << ret1 << endl;
vector<int> nums2 = {2, -1, 1};
int ret2 = obj.findClosestNumber(nums2);
cout << ret2 << endl;
return 0;
}
输出:
1
1