477. 汉明距离总和

思路:
暴力,直接超时。问题在于如何解决需要两重循环nums数组和循环判断每个位的不同所耗时间。
如果我们通过每次遍历nums数组的同时位移i位,这样只需要 O(n)的循环,虽然这里有一个i需要递增,但是一个常数,i最大为30.
那么这个方法如何判断汉明距离呢?
我们想 一个数num,他的第i位为 1,nums里其余的数的第i位有x个0,那么num和其他的数在 i 位不同的数量是不是为x,如果该位为1的数有y个,那么所有nums中的数在该位不同的数量就有x*y个,那么对于其他位也是这样考虑。因此我们把求任意两个二进制位不同的数量转成为所有数的二进制数在i位不同数量。这个转变很妙啊,因为这样我们只需要遍历一遍nums数组和遍历一遍每个数的每个位。

代码:

class Solution {
public:
    int totalHammingDistance(vector<int>& nums) {
        int n = nums.size();
        int res=0;
        for(int bit=0;bit<30;++bit){
            int one=0,zero=0;
            for(int num:nums){
                if(((num>>bit)&1)==1) one++;
                else zero++;
            }
            res += zero*one;

        }

        return res;
    }
};
posted @ 2021-05-31 17:09  Mrsdwang  阅读(32)  评论(0编辑  收藏  举报