LeetCode 3371.识别数组中的最大异常值

给你一个整数数组 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)。

相关推荐
元亓亓亓1 小时前
LeetCode热题100--74. 搜索二维矩阵--中等
算法·leetcode·矩阵
dringlestry1 小时前
B树的最大/最小高度
数据结构·b树
zzzsde1 小时前
【C++】异常:概念及使用
开发语言·c++·算法
黎梨梨梨_1 小时前
双向链表的实现
数据结构·链表
量子炒饭大师1 小时前
【一天一个计算机知识】—— 【编程百度】悬空指针
c语言·数据结构·c++·git·安全·github·dubbo
ghie90901 小时前
ART 和SART 医学CT重建迭代重建算法
人工智能·算法·计算机视觉
熊猫_豆豆1 小时前
基于改进沙猫群优化算法的Otsu图像分割
人工智能·算法·计算机视觉
吃着火锅x唱着歌1 小时前
LeetCode 624.数组列表中的最大距离
数据结构·算法·leetcode
im_AMBER1 小时前
Leetcode 64 大小为 K 且平均值大于等于阈值的子数组数目
笔记·学习·算法·leetcode