477-汉明距离总和

本文介绍了一种解决LeetCode题目477中汉明距离总和问题的高效分治算法,通过优化计算单个数字与前k个数字在每个比特位上的汉明距离,将时间复杂度降低到O(n)。核心在于利用并行计算每个比特位的独立性,实现O(1)求和。

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

题目

477. 汉明距离总和 - 力扣(LeetCode) (leetcode-cn.com)

思路

最直接的算法是遍历所有的数字组合并将每组数字的汉明距离求和,然而其时间复杂度为 O ( n 2 ) O(n^2) O(n2),会超时。

我们考虑通过分治的方法来求解。首先考虑我们以及计算得到数组numsk个数组成的区间[0, k-1]的所有数字的汉明距离总和total(0, k - 1),那么[0,k]中所有数字汉明距离的总和total(0, k)就等于total(0, k-1)加上nums[k]同前k个数字的汉明距离总和。

上述算法的时间复杂度仍然为 O ( n 2 ) O(n^2) O(n2),其同样遍历了所有数字组合,并没有达到优化的效果,不过可以看到如果求解nums[k]和前k个数的汉明距离之和可以 O ( 1 ) O(1) O(1)完成,我们就可以得到一个 O ( n ) O(n) O(n)的算法,然而,我们似乎并不能找到一种算法使得求解nums[k]和前k个数的汉明距离之和的时间复杂度为 O ( 1 ) O(1) O(1)

但是,如果我们仅考虑nums[k]和前k个数的某一个比特位(例如第n比特)的汉明距离之和,则该操作可以在 O ( 1 ) O(1) O(1)完成,因为我们可以分别记录前k个数字中第n比特为0和为1的数字数量为bit0bit1,对于nums[k],如果其第n比特为0, 则在该比特位上,nums[k]同前k个数的汉明距离之和为bit1(因为对于两个单个bit的数字,其汉明距离只能为0或者1,相同为0,否则为1);否则汉明距离之和为bit0. 这样我们就实现了在 O ( 1 ) O(1) O(1)的时间复杂度内求解nums[k]和前k个数在第n个比特位上的汉明距离之和。对于32比特的整数,由于求解汉明距离时每个比特位都是独立的,不受其他比特位的值的影响,因此只需要对32个比特位均执行一次该操作即可求得最终的汉明距离和。

代码

class Solution {
public:
    int totalHammingDistance(vector<int>& nums) {
        int r=0;
        for (int i=0; i<32; i++) {
        	// 当前比特位为0的数字数量
            int bit0 = 0;
            // 当前比特位为1的数字数量
            int bit1 = 0;
            for (int n : nums) {
                if ( (n >> i) & 0x1) {
                    r += bit0;
                    bit1++;
                } else {
                    r += bit1;
                    bit0++;
                }
            }
        }
        return r;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值