统计海明距离

  1. 题意
  2. 分析
  3. 代码

题目

题意

给定若干个数,计算其中所有数对的海明(Hamming)距离之和。

分析

如果直接计算的话,O(N^2)的代价是不可忍受的。然后就很自然地想到,我们把这个问题横向转化一下:既然海明距离计算的只是每个对应二进制位的差异,那么,我们可以直接对所有数的这一位进行统计,得到0和1的个数,然后计算这一位对整体距离的贡献:count(0) * count(1)

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Solution {
public:
int totalHammingDistance(vector<int>& nums) {
int zeroBits[31];
memset(zeroBits, 0, sizeof(zeroBits));
for (int num: nums) {
for (int i = 0; i < 31; i++) {
if ((num & (1 << i)) == 0)
zeroBits[i]++;
}
}
int ans = 0, n = nums.size();
for (int i = 0; i < 31; i++)
ans += zeroBits[i] * (n - zeroBits[i]);

return ans;
}
};

转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 yxhlfx@163.com

文章标题:统计海明距离

本文作者:红尘追风

发布时间:2015-08-12, 14:51:46

原始链接:http://www.micernel.com/2015/08/12/%E7%BB%9F%E8%AE%A1%E6%B5%B7%E6%98%8E%E8%B7%9D%E7%A6%BB/

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。

目录