以数学方式检查列表中的唯一项

我一直在解决一些 LeetCode 问题,并遇到了一个有趣的问题。我贴在下面供大家参考:

给定一个数组,其中每个元素出现 3 次,只有一个元素只出现一次。找出出现一次的元素。预期的时间复杂度为 O(n) 和 O(1) 额外空间。

输入:arr[] = {12, 1, 12, 3, 12, 1, 1, 2, 3, 3}

输出:2

在给定的数组中,除了 2 出现一次之外,所有元素都出现了 3 次。

我的解决方案是使用哈希图来尝试解决这个问题。不过,我遇到了一个数学解决方案,并想知道为什么会这样:

def singleNumber(nums):

    # applying the formula.
    return (3 * sum(set(nums)) - sum(nums)) / 2

如果有人能帮助我理解为什么会这样,那就太好了:)

回答

您找到的解决方案实际上并不是您有时会针对这些问题看到的那种“数学”解决方案。 set(nums)创建这些数字的集合,其中每个不同的数字只出现一次——类似于您对哈希图所做的事情。

您知道 sum(nums) = 3*(所有数字的总和) - 2*(唯一数字)。因此,如果您从 计算 3*(所有数字的总和)set,那么您只需减去sum(nums)并除以 2 即可找到唯一的一个。

还有就是不需要你建立一个集合,虽然数学的解决方案:

def findUnique(arr):
    c1=0
    c2=0
    for v in arr:
        carry = c1&v
        c1 ^= v
        c2 ^= carry
        threes = c1&c2
        c1 &= ~threes
        c2 &= ~threes
    return c1

你可以在这里试试:https :
//ideone.com/BPoJY5

在此解决方案中,c1和的位c2用作并行计数器来计算值中每个位的出现次数。计算是模 3 完成的,所以最后只剩下出现次数不能被 3 整除的位。


以上是以数学方式检查列表中的唯一项的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>