2044. 统计按位或能得到最大值的子集数目题解
2022.03.15 每日一题
LeetCode 题解持续更新中Github仓库地址 CSDN博客地址
今天的题目思路主要就是,寻找数组的子集,然后寻找子集按位或的最大值
说到求子集,我们第一个想到的方法一定是递归,然后我们再使用一些变量,用于存储 按位或的最大值以及当前子集的按位或的取值进行比较,就能得到最终的结果
class Solution {
public:
// 创建 res 统计个数
// 创建 maxVal 统计当前最大值
int res = 0, maxVal = 0;
int countMaxOrSubsets(vector<int> &nums) {
dfs(nums, 0, 0);
return res;
}
// nums 将数组传入函数中、index 表示当前的指数
// culVal 表示当前的值
void dfs(vector<int> &nums, int index, int culVal) {
// 当 index 的值与 数组的长度相同
// 说明此时,已经得到一个 子集 0按位或 后的值
if (index == nums.size()) {
// 如果当前的值 大于 最大值
// 就更新最大值,并且重置 结果 res 的值
if (culVal > maxVal) {
maxVal = culVal;
res = 1;
} else if (culVal == maxVal) {
// 如果 当前值与 最大值相同
// 结果就加一
res++;
}
return;
}
// 如果不满足就进行递归
// 寻找下一个数字进行按位或操作
dfs(nums, index + 1, culVal | nums[index]);
dfs(nums, index + 1, culVal);
}
};
class Solution {
// 创建 res 统计个数
// 创建 maxVal 统计当前最大值
public int res = 0, maxVal = 0;
public int countMaxOrSubsets(int[] nums) {
dfs(nums, 0, 0);
return res;
}
// nums 将数组传入函数中、index 表示当前的指数
// culVal 表示当前的值
public void dfs(int[] nums, int index, int culVal) {
// 当 index 的值与 数组的长度相同
// 说明此时,已经得到一个 子集 0按位或 后的值
if (index == nums.length) {
// 如果当前的值 大于 最大值
// 就更新最大值,并且重置 结果 res 的值
if (culVal > maxVal) {
maxVal = culVal;
res = 1;
} else if (culVal == maxVal) {
// 如果 当前值与 最大值相同
// 结果就加一
res++;
}
return;
}
// 如果不满足就进行递归
// 寻找下一个数字进行按位或操作
dfs(nums, index + 1, culVal | nums[index]);
dfs(nums, index + 1, culVal);
}
}