weekly contest 426。
題目有點繞,多看幾次才懂。

最近在刷 CF,發現根本就是 1512D - Corrupted Array

題目

輸入整數陣列 nums。
陣列中有 n 個元素,且正好有 n - 2 個元素是特別的
剩下其中兩個元素中,其中一個等於所有特別元素的和,另一個元素是異常值

異常值並不屬於特別元素或是他們的和。

求 nums 中可能的最大異常值

解法

設陣列和為 tot,特別元素和為 sp,異常值為 e。則有:

tot = sp + sp + e

先用雜湊表統計所有元素頻率。
然後枚舉 nums 中所有元素作為 e,試求 sp2 = tot - e。
若 sp2 為偶數,且有表中還有出現 sp,則代表 e 可作為異常值,更新答案。

時間複雜度 O(N)。
空間複雜度 O(N)。

class Solution:
    def getLargestOutlier(self, nums: List[int]) -> int:
        tot = sum(nums)
        d = Counter(nums)
        ans = -inf
        for e in nums:
            d[e] -= 1
            sp2 = tot - e
            if sp2 % 2 == 0 and d[sp2//2] > 0:
                ans = max(ans, e)
            d[e] += 1

        return ans