The Hamming distance between two integers is the number of positions at which the corresponding bits are different.
Now your job is to find the total Hamming distance between all pairs of the given numbers.
Example:
Input: 4, 14, 2 Output: 6 Explanation: In binary representation, the 4 is 0100, 14 is 1110, and 2 is 0010 (just showing the four bits relevant in this case). So the answer will be: HammingDistance(4, 14) + HammingDistance(4, 2) + HammingDistance(14, 2) = 2 + 2 + 2 = 6.
Note:
- Elements of the given array are in the range of
0
to10^9
- Length of the array will not exceed
10^4
.
这道题是计算总汉明距离,题目难度为Medium。
汉明距离是信息论中的重要概念,将两个数字做异或操作,统计结果中1的个数即可得出两者的汉明距离。试了下循环比对时间复杂度O(n^2)的方法,不出意外超时了。
对于所有数字中的某一位,在两两比对时如果两者不同则其为总汉明距离贡献为1,如果相同则贡献为0。这样该位为0的数字和该位为1的数字可分为两个集合,它们互相之间都能为总汉明距离贡献1,而集合内部对总汉明距离没有贡献,因此将该位为0的个数和为1的个数相乘即可得出该位对总汉明距离的贡献。这样遍历整个int的32位即可求出总汉明距离。具体代码:
class Solution {
public:
int totalHammingDistance(vector<int>& nums) {
int sz = nums.size(), dist = 0;
for(int i=0; i<32; ++i) {
int oneCnt = 0;
for(int j=0; j<sz; ++j) {
oneCnt += (nums[j] & 1);
nums[j] >>= 1;
}
dist += oneCnt * (sz - oneCnt);
}
return dist;
}
};