Watch the video solution for Maximum Hamming Distances, a hard level problem involving Array, Bit Manipulation, Breadth-First Search. This walkthrough by Programming Live with Larry has 365 views views. Want to try solving it yourself? Practice on FleetCode or read the detailed text solution.
Given an array nums and an integer m, with each element nums[i] satisfying 0 <= nums[i] < 2m, return an array answer. The answer array should be of the same length as nums, where each element answer[i] represents the maximum Hamming distance between nums[i] and any other element nums[j] in the array.
The Hamming distance between two binary integers is defined as the number of positions at which the corresponding bits differ (add leading zeroes if needed).
Example 1:
Input: nums = [9,12,9,11], m = 4
Output: [2,3,2,3]
Explanation:
The binary representation of nums = [1001,1100,1001,1011].
The maximum hamming distances for each index are:
nums[0]: 1001 and 1100 have a distance of 2.nums[1]: 1100 and 1011 have a distance of 3.nums[2]: 1001 and 1100 have a distance of 2.nums[3]: 1011 and 1100 have a distance of 3.Example 2:
Input: nums = [3,4,6,10], m = 4
Output: [3,3,2,3]
Explanation:
The binary representation of nums = [0011,0100,0110,1010].
The maximum hamming distances for each index are:
nums[0]: 0011 and 0100 have a distance of 3.nums[1]: 0100 and 0011 have a distance of 3.nums[2]: 0110 and 1010 have a distance of 2.nums[3]: 1010 and 0100 have a distance of 3.
Constraints:
1 <= m <= 172 <= nums.length <= 2m0 <= nums[i] < 2mProblem Overview: Given an array of integers where each value fits within m bits, compute the maximum Hamming distance between each number and any other number in the array. The Hamming distance counts how many bit positions differ between two numbers.
Approach 1: Pairwise Comparison (Brute Force) (Time: O(n^2 * m), Space: O(1))
The most direct method checks every pair of numbers and computes their Hamming distance using popcount(a ^ b). Iterate through the array, compare each element with all others, and track the maximum distance for each index. This approach is easy to implement and demonstrates the definition of Hamming distance clearly. However, the nested iteration makes it impractical for large arrays because every pair is evaluated explicitly. It works only when n is small.
Approach 2: Reverse Thinking + Multi-Source BFS on Bitmasks (Time: O(m * 2^m), Space: O(2^m))
The optimized solution treats every possible m-bit number as a node in a hypercube graph. Two nodes are connected if their bitmasks differ by exactly one bit. Instead of searching for the farthest number directly, reverse the thinking: compute the minimum Hamming distance from every bitmask to the closest value in the array. Initialize a multi-source BFS from all numbers in nums with distance 0. From each mask, generate neighbors by flipping one bit (mask ^ (1 << bit)) and propagate distances. This BFS effectively fills the entire 2^m state space.
To obtain the maximum Hamming distance for a number x, use its bitwise complement within the m-bit space: target = mask ^ x where mask = (1 << m) - 1. The BFS already computed the minimum distance from target to any number in the array. Because Hamming(x, y) = m - Hamming(~x, y), the answer becomes m - dist[target]. This trick converts a "maximum distance" problem into a "minimum distance" search over the bitmask graph.
The approach relies heavily on efficient bit operations and a queue-based traversal similar to standard Breadth-First Search. Each state flips one bit using Bit Manipulation, and the input values come from an Array. Because the total state space is bounded by 2^m, the BFS remains feasible when m is small (commonly ≤ 17).
Recommended for interviews: The brute force approach demonstrates understanding of Hamming distance using XOR and popcount, but interviewers expect the reverse-thinking BFS optimization. Recognizing the hypercube structure and converting a maximum-distance query into a minimum-distance BFS shows strong problem-solving skills with bitmasks and graph traversal.
| Approach | Time | Space | When to Use |
|---|---|---|---|
| Pairwise Comparison (Brute Force) | O(n^2 * m) | O(1) | Small arrays where simplicity matters more than performance |
| Reverse Thinking + Multi-Source BFS | O(m * 2^m) | O(2^m) | General case when bit length is limited and optimal performance is required |