统计按位或能得到最大值的子集数目
难度:
标签:
题目描述
代码结果
运行时间: 40 ms, 内存: 16.2 MB
/*
* Solution approach using Java Streams:
* 1. Calculate all possible OR values by generating subsets using bitwise operations.
* 2. Use IntStream to iterate through all subset combinations.
* 3. Use Collectors.groupingBy to count occurrences of each OR result and find the maximum.
*/
import java.util.*;
import java.util.stream.*;
public class SolutionStream {
public int countMaxOrSubsets(int[] nums) {
Map<Integer, Long> orCountMap = IntStream.range(1, 1 << nums.length)
.map(i -> IntStream.range(0, nums.length)
.filter(j -> (i & (1 << j)) != 0)
.map(j -> nums[j])
.reduce(0, (a, b) -> a | b))
.boxed()
.collect(Collectors.groupingBy(orValue -> orValue, Collectors.counting()));
int maxOr = Collections.max(orCountMap.keySet());
return orCountMap.get(maxOr).intValue();
}
}
解释
方法:
这个题解的核心思路是使用动态规划的方式来解决问题。首先,通过对数组中所有元素进行按位或操作,计算出能够得到的最大值 xor_sum。接着,使用一个字典 c 来保存不同子集按位或结果的出现次数。遍历每个元素 x,将已经存在的按位或结果与新元素 x 进行按位或操作,并更新这些结果的计数。特别地,每个元素自身也被视为一个子集,因此每次遍历到新元素时,都将其按位或结果计数增加1。最后,返回字典 c 中按位或结果为 xor_sum 的子集数量。
时间复杂度:
O(n * 2^17 * log(n))
空间复杂度:
O(2^17)
代码细节讲解
🦆
在解题思路中,首先提到计算所有元素的按位或结果得到最大值,如何保证这个方法能准确无误地得到最大按位或值?
▷🦆
题解中提到使用动态规划的方式解决问题,但具体的动态规划状态定义是什么?
▷🦆
为什么在遍历每个元素时,需要复制当前字典以避免在迭代过程中修改字典?具体的影响是什么?
▷🦆
返回最大按位或结果的子集数量时,如何处理如果字典中不存在xor_sum的情况?
▷