思路
按位统计:两个数在某一位上不同,这一位就对汉明距离贡献 1。
对于第 i 位:
· 统计 nums 中该位为 1 的个数 ones
· 该位为 0 的个数为 n - ones
· 任意一个「1」和一个「0」的组合都会在这一位上产生 1 个距离,所以这一位对总和的贡献是 ones * (n - ones)
把所有位(题目数据 nums[i] <= 10^9 < 2^30,遍历 0~30 位即可)的贡献累加。
Java 实现
classSolution{publicinttotalHammingDistance(int[]nums){intn=nums.length;longans=0;for(inti=0;i<31;i++){intones=0;for(intx:nums){ones+=(x>>i)&1;}ans+=(long)ones*(n-ones);}return(int)ans;}}复杂度分析
· 时间复杂度:O(31 * n),即 O(n),n 为数组长度。
· 空间复杂度:O(1)。
细节说明
- 为什么是 31 位? nums[i] <= 10^9,约 2^30,取 31 位(0~30)足够覆盖。
- 为什么中间用 long? ones * (n - ones) 最大约为 n^2/4,当 n = 10^4 时约 2.5 * 10^7,再乘位数仍可能接近 int 上限,使用 long 累加避免溢出。
- 与暴力 O(n^2) 两两比较相比,按位统计是本题的标准最优解。
示例
输入: nums = [4, 14, 2] 输出: 6 二进制: 4 = 0100 14 = 1110 2 = 0010逐位看:
· 第 1 位:1 的个数 2,0 的个数 1 → 2×1 = 2
· 第 2 位:1 的个数 2,0 的个数 1 → 2
· 第 3 位:1 的个数 1,0 的个数 2 → 2
· 其余位全为 0 → 0
总和 = 2 + 2 + 2 = 6 ✓