[leetcode] 477. Total Hamming Distance

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:

  1. Elements of the given array are in the range of to 10^9
  2. 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;
    }
};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值