P477汉明距离总和


  • 今天的题乍一看好想和昨天的差不多,只是需要遍历数组
  • 于是我就这么做了
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
class Solution {
public HashMap<Integer,Integer> map = new HashMap<>();
public int totalHammingDistance(int[] nums) {
int result = 0;
Integer xOr;

for (int i = 0; i < nums.length-1; i++) {
for (int j = i+1; j < nums.length; j++) {
if(nums[i]==nums[j])continue;

xOr = nums[i] ^ nums[j];
Integer val = map.get(xOr);
if(val!=null){
result += val;
}else{
int temp = 0;
while (xOr!= 0) {
xOr = xOr & (xOr - 1);
temp++;
}
result += temp;
map.put(xOr, temp);
}
}
}

return result;
}

}
  • hhh

  • 好吧,我也知道这么做时间复杂度高
  • 但是你这数据…x(

我需要转换一下思路

  • 对于数组中的数字的同一个二进制位,将1和0的数目相乘就是这一位的汉明距离之和

    比如,10个数,某一位6个1,4个零,那汉明距离之和就是6x4
    显然1之间汉明距离为零,只有和0之间汉明距离为1,而有4个0,所以是6x4

  • 给出的数字是30位int,所以只需遍历30位即可
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Solution {

public int totalHammingDistance(int[] nums) {
int result = 0;
int temp = 0;
for (int i = 0; i < 30; i++) {
temp = 0;
for (int j = 0; j < nums.length; j++) {

temp+= ((nums[j]>>i)&1);
}
result+=temp*(nums.length-temp);
}
return result;
}

}

← Prev 图 | P461汉明距离 Next →