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

相关推荐
条tiao条19 小时前
KMP 算法详解:告别暴力匹配,让字符串匹配 “永不回头”
开发语言·算法
干啥啥不行,秃头第一名20 小时前
C++20概念(Concepts)入门指南
开发语言·c++·算法
tobias.b20 小时前
计算机基础知识-数据结构
java·数据结构·考研
zzh9407720 小时前
Gemini 3.1 Pro 硬核推理优化剖析:思维织锦、动态计算与国内实测
算法
2301_8073671920 小时前
C++中的解释器模式变体
开发语言·c++·算法
愣头不青20 小时前
617.合并二叉树
java·算法
MIUMIUKK21 小时前
双指针三大例题
算法
灵感__idea21 小时前
Hello 算法:复杂问题的应对策略
前端·javascript·算法
2301_819414301 天前
C++与区块链智能合约
开发语言·c++·算法
Zaly.1 天前
【Python刷题】LeetCode 1727 重新排列后的最大子矩阵
算法·leetcode·矩阵