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 <= numsi <= 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)。

相关推荐
Nil2085 分钟前
leetcode 98验证二叉搜索树
算法·leetcode·职场和发展
kkkkkkkkkk_Z13 分钟前
学嵌入式和C语言编程数据结构|学习日记Day21:内核链表与队列学习
c语言·数据结构·学习
不正经学生24 分钟前
C语言结构体:自定义数据类型,让变量打包出行
java·c语言·开发语言·数据结构·算法
cxr8281 小时前
数学的本质:关系、模式与不变量的结构世界
人工智能·算法·机器学习
程与留1 小时前
06_Qt 常用数据类型与容器:QString、QList、QVector、QMap 的性能与实现分析
数据结构·qt
林森lsjs2 小时前
队列 FIFO 原理 & 手撕两种队列实现(链表 + 循环数组)—数据结构陆
java·开发语言·数据结构·队列
H_oRIZoN_2 小时前
Linux入门DAY23(C语言树形结构)
linux·c语言·数据结构
初夏睡觉2 小时前
原创题目 - 空壳恋爱
c++·算法·dp·oi·信息学·原创题目·值得挑战的题目
间歇性努力持续性发呆的野生快乐选手2 小时前
stl容器使用和算法简介
数据结构·c++
Buke..2 小时前
【APP 逆向】哔哩哔哩 sign 参数逆向(下):OLLVM 混淆还原 sign 算法
java·javascript·爬虫·python·算法