477. 汉明距离总和
汉明距离总和
- 题目描述
- 尝试做法
- 推荐做法
题目描述
两个整数的 汉明距离 指的是这两个数字的二进制数对应位不同的数量。
给你一个整数数组 nums,请你计算并返回 nums 中任意两个数之间 汉明距离的总和 。
示例 1:
输入:nums = [4,14,2]
输出:6
解释:在二进制表示中,4 表示为 0100 ,14 表示为 1110 ,2表示为 0010 。(这样表示是为了体现后四位之间关系)
所以答案为:
HammingDistance(4, 14) + HammingDistance(4, 2) + HammingDistance(14, 2) = 2 + 2 + 2 = 6
示例 2:
输入:nums = [4,14,4]
输出:4
提示:
1 <= nums.length <= 104
0 <= nums[i] <= 109
给定输入的对应答案符合 32-bit 整数范围
尝试做法
class Solution {
public int totalHammingDistance(int[] nums) {
int ans = 0;
for(int i = 0; i < nums.length; ++i){
for(int j = i; j < nums.length; ++j){
ans += Integer.bitCount(nums[i] ^ nums[j]);
}
}
return ans;
}
}
没有想到可以降低时空复杂度的方法
推荐做法
class Solution {
public int totalHammingDistance(int[] nums) {
int ans = 0;
for (int x = 31; x >= 0; x--) {
int s0 = 0, s1 = 0;
for (int u : nums) {
if (((u >> x) & 1) == 1) {
s1++;
} else {
s0++;
}
}
ans += s0 * s1;
}
return ans;
}
}
作者:宫水三叶
链接:https://leetcode.cn/problems/total-hamming-distance/solutions/799569/gong-shui-san-xie-ying-yong-cheng-fa-yua-g21t/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
将数组元素化零为整,作为一个整体来看待
计算32位int中的每一位会产生的海明距离,然后再求和