zoukankan      html  css  js  c++  java
  • LeetCode NO477.汉明距离总和

    两个整数的 汉明距离 指的是这两个数字的二进制数对应位不同的数量。

    计算一个数组中,任意两个数之间汉明距离的总和。

    示例:

    输入: 4, 14, 2
    
    输出: 6
    
    解释: 在二进制表示中,4表示为0100,14表示为1110,2表示为0010。(这样表示是为了体现后四位之间关系)
    所以答案为:
    HammingDistance(4, 14) + HammingDistance(4, 2) + HammingDistance(14, 2) = 2 + 2 + 2 = 6.
    

    注意:

    1. 数组中元素的范围为从 0到 10^9
    2. 数组的长度不超过 10^4
    class Solution {
    public:
        int totalHammingDistance(vector<int>& nums) {
            int hd = 0;
            for(int i=0;i<32;i++){
                int zs=0, os=0;
                for(auto it=nums.begin();it!=nums.end();it++)
                    if(*it&(1<<i)) os++;
                    else zs++;
                hd += os*zs;
            }
            return hd;
        }
    };

    两两求Hamming距离再汇总,复杂度O(n²)。

    简化一下,在每个二进制位上分别统计1和0的个数os和zs,在这一位上的Hamming距离(说法不太严格)实际上就是os*zs。

    如此这般,复杂度为O(n*b),b为最大二进制位数。

  • 相关阅读:
    437. Path Sum III
    51. N-Queens
    dfs 感悟
    Topological Sorting
    138 Copy List with Random Pointer
    130. Surrounded Regions
    The sum problem
    A + B Again
    Rectangles
    An easy problem
  • 原文地址:https://www.cnblogs.com/jiujing23333/p/9356091.html
Copyright © 2011-2022 走看看