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

相关推荐
蜡笔小马4 小时前
10.Boost.Geometry R-tree 空间索引详解
开发语言·c++·算法·r-tree
我是咸鱼不闲呀4 小时前
力扣Hot100系列20(Java)——[动态规划]总结(下)( 单词拆分,最大递增子序列,乘积最大子数组 ,分割等和子集,最长有效括号)
java·leetcode·动态规划
唐梓航-求职中4 小时前
编程-技术-算法-leetcode-288. 单词的唯一缩写
算法·leetcode·c#
仟濹4 小时前
【算法打卡day3 | 2026-02-08 周日 | 算法: BFS】3_卡码网99_计数孤岛_BFS | 4_卡码网100_最大岛屿的面积DFS
算法·深度优先·宽度优先
Ll13045252984 小时前
Leetcode二叉树part4
算法·leetcode·职场和发展
Queenie_Charlie4 小时前
stars(树状数组)
数据结构·c++·树状数组
颜酱4 小时前
二叉树遍历思维实战
javascript·后端·算法
宝贝儿好4 小时前
第二章: 图像处理基本操作
算法
静听山水4 小时前
Redis核心数据结构-Set
数据结构·数据库·redis
小陈phd4 小时前
多模态大模型学习笔记(二)——机器学习十大经典算法:一张表看懂分类 / 回归 / 聚类 / 降维
学习·算法·机器学习