leetcode 477. Total Hamming Distance 任意两数字汉明距离和+32Bit遍历求解
2017-12-13 09:41
531 查看
The Hamming distance between two integers is the number of positions at which the corresponding bits are different.
Now your job is to find the total Hamming distance between all pairs of the given numbers.
Example:
Input: 4, 14, 2
Output: 6
Explanation: In binary representation, the 4 is 0100, 14 is 1110, and 2 is 0010 (just
showing the four bits relevant in this case). So the answer will be:
HammingDistance(4, 14) + HammingDistance(4, 2) + HammingDistance(14, 2) = 2 + 2 + 2 = 6.
Note:
Elements of the given array are in the range of 0 to 10^9
Length of the array will not exceed 10^4.
这道题是之前那道leetcode 461. Hamming Distance的拓展,由于有之前那道题的经验,我们知道需要用异或来求每个位上的情况,那么我们需要来找出某种规律来,比如我们看下面这个例子,4,14,2和1:
4: 0 1 0 0
14: 1 1 1 0
2: 0 0 1 0
1: 0 0 0 1
我们先看最后一列,有三个0和一个1,那么它们之间相互的汉明距离就是3,即1和其他三个0分别的距离累加,然后在看第三列,累加汉明距离为4,因为每个1都会跟两个0产生两个汉明距离,同理第二列也是4,第一列是3。我们仔细观察累计汉明距离和0跟1的个数,我们可以发现其实就是0的个数乘以1的个数,发现了这个重要的规律,那么整道题就迎刃而解了,只要统计出每一位的1的个数即可
代码如下:
Now your job is to find the total Hamming distance between all pairs of the given numbers.
Example:
Input: 4, 14, 2
Output: 6
Explanation: In binary representation, the 4 is 0100, 14 is 1110, and 2 is 0010 (just
showing the four bits relevant in this case). So the answer will be:
HammingDistance(4, 14) + HammingDistance(4, 2) + HammingDistance(14, 2) = 2 + 2 + 2 = 6.
Note:
Elements of the given array are in the range of 0 to 10^9
Length of the array will not exceed 10^4.
这道题是之前那道leetcode 461. Hamming Distance的拓展,由于有之前那道题的经验,我们知道需要用异或来求每个位上的情况,那么我们需要来找出某种规律来,比如我们看下面这个例子,4,14,2和1:
4: 0 1 0 0
14: 1 1 1 0
2: 0 0 1 0
1: 0 0 0 1
我们先看最后一列,有三个0和一个1,那么它们之间相互的汉明距离就是3,即1和其他三个0分别的距离累加,然后在看第三列,累加汉明距离为4,因为每个1都会跟两个0产生两个汉明距离,同理第二列也是4,第一列是3。我们仔细观察累计汉明距离和0跟1的个数,我们可以发现其实就是0的个数乘以1的个数,发现了这个重要的规律,那么整道题就迎刃而解了,只要统计出每一位的1的个数即可
代码如下:
#include <iostream> #include <vector> #include <map> #include <unordered_map> #include <set> #include <unordered_set> #include <queue> #include <stack> #include <string> #include <climits> #include <algorithm> #include <sstream> #include <functional> #include <bitset> #include <numeric> #include <cmath> #include <regex> #include <iomanip> #include <cstdlib> #include <ctime> using namespace std; class Solution { public: int totalHammingDistance(vector<int>& a) { int res = 0; for (int i = 0; i < 32; i++) { int count = 0; for (int one : a) { int tmp = one&(1 << i); if (tmp != 0) count++; } res += count*(a.size() - count); } return res; } //下面通过位运算和循环来做的,不过超时了 int totalHammingDistanceByLoop(vector<int>& nums) { int sum = 0; for (int i = 0; i < nums.size(); i++) { for (int j = i + 1; j < nums.size(); j++) { sum += getHanmmingDistance(nums[i], nums[j]); } } return sum; } int getHanmmingDistance(int a, int b) { int n = a^b; int count = 0; while (n > 0) { count++; n = n&(n - 1); } return count; } };
相关文章推荐
- [leetcode, python] Total Hamming Distance 多个数字之间的汉明距离
- [leetcode, python] Total Hamming Distance 多个数字之间的汉明距离
- [leetcode, python] Total Hamming Distance 多个数字之间的汉明距离
- [leetcode, python] Total Hamming Distance 多个数字之间的汉明距离
- [leetcode, python] Total Hamming Distance 多个数字之间的汉明距离
- [leetcode, python] Total Hamming Distance 多个数字之间的汉明距离
- [leetcode, python] Total Hamming Distance 多个数字之间的汉明距离
- [leetcode, python] Total Hamming Distance 多个数字之间的汉明距离
- [leetcode, python] Total Hamming Distance 多个数字之间的汉明距离
- [leetcode, python] Total Hamming Distance 多个数字之间的汉明距离
- [leetcode, python] Total Hamming Distance 多个数字之间的汉明距离
- [leetcode, python] Total Hamming Distance 多个数字之间的汉明距离
- poj2255 根据任意二叉树的先序遍历和中序遍历求解后序遍历
- LeetCode--461. Hamming Distance(汉明距离)Python
- 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
- 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
- leetcode 42. Trapping Rain Water 正反循环遍历求解
- Leetcode-Algorithms Hamming Distance(汉明距离)
- leetcode Hamming Distance 汉明距离
- leetcode 671. Second Minimum Node In a Binary Tree 第二小数字 + 深度优先遍历DFS