1863. Sum of All Subset XOR Totals
Difficulty: Easy
Topics: Array
, Math
, Backtracking
, Bit Manipulation
, Combinatorics
, Enumeration
The XOR total of an array is defined as the bitwise XOR
of all its elements, or 0
if the array is empty.
- For example, the XOR total of the array
[2,5,6]
is2 XOR 5 XOR 6 = 1
.
Given an array nums
, return the sum of all XOR totals for every subset of nums
.
Note: Subsets with the same elements should be counted multiple times.
An array a
is a subset of an array b
if a
can be obtained from b
by deleting some (possibly zero) elements of b
.
Example 1:
- Input: nums = [1,3]
- Output: 28
-
Explanation: The 4 subsets of [1,3] are:
- The empty subset has an XOR total of 0.
- [1] has an XOR total of 1.
- [3] has an XOR total of 3.
- [1,3] has an XOR total of 1 XOR 3 = 2.
0 + 1 + 3 + 2 = 6
Example 2:
- Input:nums = [5,1,6]
- Output: 28
-
Explanation: The 8 subsets of [5,1,6] are:
- The empty subset has an XOR total of 0.
- [5] has an XOR total of 5.
- [1] has an XOR total of 1.
- [6] has an XOR total of 6.
- [5,1] has an XOR total of 5 XOR 1 = 4.
- [5,6] has an XOR total of 5 XOR 6 = 3.
- [1,6] has an XOR total of 1 XOR 6 = 7.
- [5,1,6] has an XOR total of 5 XOR 1 XOR 6 = 2.
0 + 5 + 1 + 6 + 4 + 3 + 7 + 2 = 28
Example 3:
- Input: nums = [3,4,5,6,7,8]
- Output: 480
- Explanation: The sum of all XOR totals for every subset is 480.
Constraints:
1 <= nums.length <= 12
1 <= nums[i] <= 20
Hint:
- Is there a way to iterate through all the subsets of the array?
- Can we use recursion to efficiently iterate through all the subsets?
Solution:
We need to calculate the sum of all XOR totals for every subset of a given array. The key insight here is to leverage bit manipulation and mathematical properties to avoid generating all subsets explicitly, which would be computationally expensive.
Approach
The XOR total of a subset is determined by the bitwise XOR of all its elements. For each bit position, the XOR result will have that bit set if an odd number of elements in the subset have that bit set.
- Bitwise OR Calculation: The bitwise OR of all elements in the array helps identify which bits are set in at least one element. If a bit is set in the OR result, it means there is at least one element in the array with that bit set.
- Contribution Calculation: Each bit that is set in the OR result contributes to the final sum. The number of subsets where a bit is set can be determined by the formula 2n-1, where n is the number of elements in the array. This is because for each bit, half of all possible subsets (excluding the empty subset) will have an odd count of elements with that bit set.
Let's implement this solution in PHP: 1863. Sum of All Subset XOR Totals
<?php
/**
* @param Integer[] $nums
* @return Integer
*/
function subsetXORSum($nums) {
...
...
...
/**
* go to ./solution.php
*/
}
subsetXORSum([1,3]); // Output: 6
subsetXORSum([5,1,6]); // Output: 28
subsetXORSum([3,4,5,6,7,8]); // Output: 480
?>
Explanation:
-
Bitwise OR Calculation: The
array_reduce
function is used to compute the bitwise OR of all elements in the array. This gives a number where each bit is set if it is set in at least one element of the array. - Contribution Calculation: The result of the OR operation is then shifted left by n-1 positions, where n is the number of elements in the array. This is equivalent to multiplying the OR result by 2n-1, which accounts for the contribution of each bit being set in all valid subsets.
This approach efficiently computes the required sum in O(n) time complexity, where n is the number of elements in the array, making it highly efficient even for the upper constraint of n = 12.
Contact Links
If you found this series helpful, please consider giving the repository a star on GitHub or sharing the post on your favorite social networks 😍. Your support would mean a lot to me!
If you want more helpful content like this, feel free to follow me:
Top comments (0)