Leetcode--260. 只出现一次的数字Ⅲ
发布日期:2021-04-30 21:04:46 浏览次数:66 分类:精选文章

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

为了解决这个问题,我们需要找出整数数组中恰好出现一次的两个元素。我们可以利用异或操作的性质来高效地解决这个问题,并且确保算法在时间和空间复杂度上都是线性的。

方法思路

  • 计算异或结果:首先,我们对数组中的所有元素进行异或操作,得到一个结果a。这个结果a实际上是两个出现一次的元素的异或结果。
  • 提取最低位:接下来,我们找到a的最低位是否为1。如果是,我们可以利用这个位来分组处理数组中的元素。
  • 分组处理:将数组中的元素分为两组,分别对应于最低位为0和1的元素。然后,对每组进行异或操作,得到两个结果,这两个结果就是我们要找的两个出现一次的元素。
  • 这种方法利用了异或操作的性质,使得时间复杂度保持为O(n),并且空间复杂度为O(1)。

    解决代码

    def single_numbers(nums):    a = 0    for num in nums:        a ^= num    # 提取a的最低位    a ^= (a & -a)    # 初始化结果数组    result = [0, 0]    # 遍历数组中的每个数    for num in nums:        if (a ^ num) == 0:            result[0] ^= num        else:            result[1] ^= num    return result

    代码解释

  • 计算异或结果:遍历数组,计算所有元素的异或结果a。这个结果a是两个出现一次的元素的异或结果。
  • 提取最低位:使用a & -a来提取a的最低位。这个操作使得a的最低位被清零。
  • 分组处理:遍历数组中的每个元素,检查其是否等于结果数组中的一个元素。如果是,进行异或操作,更新结果数组中的值。否则,将其异或到另一个结果中。
  • 返回结果:返回结果数组,包含两个出现一次的元素。
  • 这种方法确保了在O(n)的时间复杂度内解决问题,并且仅使用常数额外空间。

    上一篇:指令整理
    下一篇:2020 第十一届蓝桥杯java C组 省赛真题

    发表评论

    最新留言

    做的很好,不错不错
    [***.243.131.199]2026年06月06日 00时06分52秒