之前的算法是O(n^3)的,速度比较慢,果然TLE了。这里把计算hamming_distance也算一层。
class Solution {
public:
static int HammingDistance(int a, int b)
{
int c = a ^ b;
int dis = 0;
while(c > 0)
{
dis += (c % 2);
c = c >> 1;
}
return dis;
}
int totalHammingDistance(vector<int>& nums) {
int nums_len = nums.size();
int hamming_distance = 0;
std::sort(nums.begin(), nums.end());
for(int i = 0; i < nums_len - 1; i++)
{
for(int j = i + 1; j < nums_len; j++)
{
hamming_distance += HammingDistance(nums[i], nums[j]);
}
}
return hamming_distance;
}
};
后来想了一下,发现不一定要每个数字比较,可以对每个数字的相同bit位进行计算。这样可以看成是O(n^2)。所以就有了:
class Solution {
public:
int totalHammingDistance(vector<int>& nums) {
int nums_len = nums.size();
int hamming_distance = 0;
int break_flag = 0;
int pq[2] = {0};
int count = 0;
while(1)
{
pq[0] = 0;
pq[1] = 0;
count = 0;
for(int i = 0; i < nums_len; i++)
{
int tmp = nums[i];
if(tmp == 0)
{
count++;
}
tmp = nums[i]%2;
pq[1 - tmp]++;
nums[i] = nums[i] >> 1;
}
if(count == nums_len)
break;
hamming_distance += pq[0]*pq[1];
}
return hamming_distance;
}
};
附上461简答题:
class Solution {
public:
int hammingDistance(int x, int y) {
int c = x^y;
int dis = 0;
while(c > 0)
{
dis += c%2;
c = c>>1;
}
return dis;
}
};