leetcode 477解答

本文介绍两种计算一组整数间Hamming距离的方法。一种是通过两两比较并计算异或后的1的数量;另一种更高效的算法是统计每一位上的1的总数,并以此来计算总的Hamming距离。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Hamming距离综合,Hamming距离ji两个二进制数不相同位的个数的总和例如:二进制表示中,2是0010,4是0100,14是1110,则HammingDistance(2,4) + HammingDistance(2,14) + HammingDistance(4,14) = 2+2+2 = 6。

思路:求两个值的异或后算其中1的值

class Solution {
public:
    int totalHammingDistance(vector<int>& nums) {
        if(nums.size() < 2)
        return 0;
        int res=0;
        for(int i = 0;i<nums.size();i++)
         for(int j = i+1;j<nums.size();j++)
          res += HammingDistance(nums[i],nums[j]);
    return res;
    }
    int HammingDistance(int num1, int num2) {
         int num = num1 ^ num2;
        int count = 0;
         for(int i=0; i < 31; i++) {
             count += 1 & num;
             num = num >> 1;
         }
         return count;
     }
};

但这种方法效率很低,会超出时间无法通过,查看论坛上别人的代码,有一种方法直接统计所有数字的同一位1的个数count,然后这个位就会为总的Hamming距离贡献count*(nums.size-count),再相加所有位的这个值就可以得到总的Hamming距离。

class Solution {
public:
    int totalHammingDistance(vector<int>& nums) {
       int total  = 0;
       for(int i = 0;i<32;i++){
        int bitcount = 0;
        for(int j=0;j<nums.size();j++)
          bitcount += (nums[j] >> i) & 1;
         total +=  bitcount*(nums.size() - bitcount);
     }
     return total;
    }
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值