给你一个整数数组 nums。该数组包含 n 个元素,其中 恰好 有 n - 2 个元素是 特殊数字 。剩下的 两个 元素中,一个是所有 特殊数字 的 和 ,另一个是 异常值 。
异常值 的定义是:既不是原始特殊数字之一,也不是表示元素和的那个数。
注意,特殊数字、和 以及 异常值 的下标必须 不同 ,但可以共享 相同 的值。
返回 nums 中可能的 最大异常值。
示例 1:
输入: nums = [2,3,5,10]
输出: 10
解释:
特殊数字可以是 2 和 3,因此和为 5,异常值为 10。
示例 2:
输入: nums = [-2,-1,-3,-6,4]
输出: 4
解释:
特殊数字可以是 -2、-1 和 -3,因此和为 -6,异常值为 4。
示例 3:
输入: nums = [1,1,1,1,1,5,5]
输出: 5
解释:
特殊数字可以是 1、1、1、1 和 1,因此和为 5,另一个 5 为异常值。
提示:
3 <= nums.length <= 10 5 ^5 5
-1000 <= nums[i] <= 1000
输入保证 nums 中至少存在 一个 可能的异常值。
我们可以用哈希表保存下来nums中的每个数字及其出现次数,然后对nums求和得到sum,数组中有一个数字是另外n-2个数字的和,将其记为S,那么sum=2*S+异常值,因此我们可以遍历nums,对于当前遍历到的数字i,我们看可能的异常值=sum-2*i是否存在,如果存在,说明找到了一个异常值,找出最大的即可:
cpp
class Solution {
public:
int getLargestOutlier(vector<int>& nums) {
int total = 0;
unordered_map<int, int> cnt;
for (int i : nums) {
total += i;
++cnt[i];
}
int ans = -1001;
for (int i : nums) {
int target = total - 2 * i;
// 由于异常值可以等于S,因此需要&&后面的判断
if (cnt.find(target) != cnt.end() && (i != target || cnt[target] > 1)) {
ans = max(ans, target);
}
}
return ans;
}
};
如果nums的长度为n,则此算法时间复杂度为O(n),空间复杂度为O(n)。