leetcode 477

这题技巧题,没做出来。越到正确率低的题,发现自己被大神的解法秀的头晕。这题是给一组数字,求它们两两之间hamming distance之和。当然,萌新做法是遍历每一对数字,求出它们的hamming distance,然后再求和得到结果。coding的时候都是虚的,因为想到了这题怎么可能会让用那么low的方法。最后看了大神的解答后,才恍然大悟。正确的解法应该是针对每一个bit位,统计所有数字在这个bit位上面的1的个数bitCount。那么这一位对结果的贡献就是bitCount*(n-bitCount)。因为每一对数字都会被遍历,又因为相同数字的对不会对最后的结果产生影响。所以最后产生影响的就是那些不同数字的组合,这样的组会一共就有那么多个。这样我们通过遍历了32个bit位,我们就能够在O(n)的算法复杂度下得到我们想要的结果。这个si'lu

这个思路主要的转变就是我们是想要遍历每一对数字看它的所有bit位,大神们的思路是遍历每个bit位,来看所有的数字。所以,有时候思路的内外循环更替会有好处。附代码

class Solution:
    def totalHammingDistance(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        total = 0
        for i in range(0,32):
            bitCount = 0
            for j in range(len(nums)):
                value = nums[j]
                bitCount = bitCount + ((value >> i) & 1)
            total += bitCount*(len(nums)-bitCount)
        return total

你可能感兴趣的:(leetcode,mark)