LeetCode:136. 只出现一次的数字!!
发布日期:2021-05-08 02:38:23 浏览次数:18 分类:精选文章

本文共 762 字,大约阅读时间需要 2 分钟。

要解决这个问题,我们需要找出一个整数数组中只出现一次的数字。给定的数组中,除了某个元素只出现一次外,其余每个元素均出现两次。我们的目标是设计一个高效的算法,具备线性时间复杂度,并且不使用额外的空间。

解题思路

为了高效地解决这个问题,我们可以运用数学思想。具体步骤如下:

  • 计算集合的总和:将数组转换成集合,然后计算集合中所有元素的总和。由于集合中的每个元素都只出现一次,所以这个总和就是所有不同元素的和。
  • 计算双倍总和:将集合的总和乘以二。这是因为如果所有元素都出现两次,那么它们的总和应该是双倍的集合总和。
  • 计算原数组的总和:直接计算数组中所有元素的总和,包括重复的元素。
  • 找出差异:用双倍总和减去原数组的总和,差值即为只出现一次的数字。
  • 这种方法的时间复杂度为 O(n),因为我们只需要遍历数组两次:一次计算总和,另一次计算双倍总和。空间复杂度为 O(1),因为我们只使用了常数额外的空间。

    解决代码

    class Solution:
    def singleNumber(self, nums: List[int]) -> int:
    sum_set = sum(set(nums))
    sum_nums = sum(nums)
    return 2 * sum_set - sum_nums

    代码解释

  • sum_set:首先将数组转换为集合,计算集合中所有元素的总和。由于集合中每个元素只出现一次,所以这个总和就是所有不同元素的和。
  • sum_nums:直接计算数组中所有元素的总和,包括重复的元素。
  • 返回差异:计算 2 * sum_set - sum_nums,这个差值就是只出现一次的数字。因为如果所有元素都出现两次,那么总和应该是双倍的集合总和,差值即为只出现一次的元素。
  • 上一篇:(新手小白必学!)用Python设计和实现聪明的尼姆游戏(人机对战)!!!!
    下一篇:LeetCode:922. 按奇偶排序数组 II

    发表评论

    最新留言

    感谢大佬
    [***.8.128.20]2025年03月20日 17时18分40秒