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之路的主要内容,如果未能解决你的问题,请参考以下文章
LeetCode 477 / 剑指 Offer 63 / 64 /65 / 66