LeetCode 477 汉明距离总和[数学 异或] HERODING的LeetCode之路

Posted HERODING23

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode 477 汉明距离总和[数学 异或] HERODING的LeetCode之路相关的知识,希望对你有一定的参考价值。

在这里插入图片描述解题思路:
与汉明距离一题简直就是父子题,当我拿到这道题的时候,直接想着就是调用汉明距离题目里的函数,然后双层for循环即可,代码如下:

class Solution {
public:
    int totalHammingDistance(vector<int>& nums) {
        int sum = 0;
        int len = nums.size();
        for(int i = 0; i < len - 1; i ++) {
            for(int j = i + 1; j < len; j ++) {
                sum += culHammingDistance(nums[i], nums[j]);
            }
        }
        return sum;
    }

    int culHammingDistance(int a, int b) {
        int sum = 0;
        for(int i = 31; i >= 0; i --) {
            sum += (a >> i & 1) ^ (b >> i & 1);
        }
        return sum;
    }
};

但是很明显,时间复杂度达到了O(n^3),最后结果也果然超时了,还是得用更加机智的方法呀,那就是遍历每一二进制位,每一位上1和0个数的乘积就是任意两个数字某一位上不同的总和,最后加起来即可,代码如下:

class Solution {
public:
    int totalHammingDistance(vector<int>& nums) {
        int sum = 0;
        int len = nums.size();
        // 遍历每一位
        for(int i = 31; i >= 0; i --) {
            int num = 0; 
            for(int& n : nums) {
                // 统计1个个数
                num += n >> i & 1;
            }
            sum += num * (len - num);
        }
        return sum;
    }
};


/*作者:heroding
链接:https://leetcode-cn.com/problems/total-hamming-distance/solution/cxiang-jie-by-heroding-x6y8/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。*/

以上是关于LeetCode 477 汉明距离总和[数学 异或] HERODING的LeetCode之路的主要内容,如果未能解决你的问题,请参考以下文章

477. 汉明距离总和

LeetCode 0477. 汉明距离总和

LeetCode 477 / 剑指 Offer 63 / 64 /65 / 66

477. 汉明距离总和

477 Total Hamming Distance 汉明距离总和

《LeetCode之每日一题》:50.汉明距离总和