找出数组中的所有孤独数字

标签: 数组 哈希表 计数

难度: Medium

给你一个整数数组 nums 。如果数字 x 在数组中仅出现 一次 ,且没有 相邻 数字(即,x + 1x - 1)出现在数组中,则认为数字 x孤独数字

返回 nums 中的 所有 孤独数字。你可以按 任何顺序 返回答案。

示例 1:

输入:nums = [10,6,5,8]
输出:[10,8]
解释:
- 10 是一个孤独数字,因为它只出现一次,并且 9 和 11 没有在 nums 中出现。
- 8 是一个孤独数字,因为它只出现一次,并且 7 和 9 没有在 nums 中出现。
- 5 不是一个孤独数字,因为 6 出现在 nums 中,反之亦然。
因此,nums 中的孤独数字是 [10, 8] 。
注意,也可以返回 [8, 10] 。

示例 2:

输入:nums = [1,3,5,3]
输出:[1,5]
解释:
- 1 是一个孤独数字,因为它只出现一次,并且 0 和 2 没有在 nums 中出现。
- 5 是一个孤独数字,因为它只出现一次,并且 4 和 6 没有在 nums 中出现。
- 3 不是一个孤独数字,因为它出现两次。
因此,nums 中的孤独数字是 [1, 5] 。
注意,也可以返回 [5, 1] 。

提示:

  • 1 <= nums.length <= 105
  • 0 <= nums[i] <= 106

Submission

运行时间: 153 ms

内存: 37.5 MB

class Solution:
    def findLonely(self, nums: List[int]) -> List[int]:
        c = Counter(nums)
        out_list = []
        for x, v in c.items():
            if v == 1 and x - 1 not in c and x + 1 not in c:
                out_list.append(x)
        return out_list

Explain

该题解首先使用Counter来统计数组nums中每个数字出现的次数。然后,遍历这个计数器。对于每个键值对(即数字及其出现次数),检查该数字是否只出现一次(即次数为1),并且其相邻的数字(即x-1和x+1)是否没有出现在数组中。如果这些条件都满足,那么这个数字就被认为是孤独的,并将其添加到输出列表中。最后,返回这个列表。

时间复杂度: O(n)

空间复杂度: O(n)

class Solution:
    def findLonely(self, nums: List[int]) -> List[int]:
        c = Counter(nums)  # 使用Counter统计每个数字的出现次数
        out_list = []  # 初始化输出列表
        for x, v in c.items():  # 遍历计数器的每个项
            if v == 1 and x - 1 not in c and x + 1 not in c:  # 检查每个数字是否孤独
                out_list.append(x)  # 如果是孤独的,则添加到输出列表
        return out_list  # 返回输出列表

Explore

Counter本质上是一个字典(哈希表),哈希表的查找操作通常具有O(1)的平均时间复杂度。因此,当算法检查一个数字的相邻数字(x-1和x+1)是否存在于Counter中时,这些操作都是高效的。哈希表结构使得即使在数字范围较大的情况下,查找操作仍然能保持较快的执行速度。

Counter是Python中collections模块提供的一个专门用于计数的数据结构,它扩展了普通字典的功能,使其能够更方便地统计元素出现次数。虽然使用普通字典也可以实现相同的功能,Counter提供的接口使得代码更简洁易读。集合不适用于此算法,因为集合只能存储键而不存储键对应的次数。

在算法中,提到的最多3次哈希表查找包括对数字自身的查找以及对其相邻数字(x-1和x+1)的查找。对自己的查找是为了确认该数字在数组中确实只出现了一次(即次数为1)。这是确定一个数字是否孤独的关键部分,因为如果一个数字出现多次,即使其相邻数字不在数组中,它也不能被认为是孤独的。

如果输入数组为空数组,Counter将为空,循环不会执行,直接返回一个空列表。如果数组只包含一个元素,算法会检查这个唯一的数字是否孤独:由于其相邻的数字(x-1和x+1)不在数组中,并且其自身的出现次数为1,因此这个数字会被识别为孤独的并返回这个单一元素的列表。