2044. 统计按位或能得到最大值的子集数目
给你一个整数数组 nums ,请你找出 nums 子集 按位或 可能得到的 最大值 ,并返回按位或能得到最大值的 不同非空子集的数目 。
如果数组 a 可以由数组 b 删除一些元素(或不删除)得到,则认为数组 a 是数组 b 的一个 子集 。如果选中的元素下标位置不一样,则认为两个子集 不同 。
对数组 a 执行 按位或 ,结果等于 a[0] OR a[1] OR ... OR a[a.length - 1](下标从 0 开始)。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/count-number-of-maximum-bitwise-or-subsets
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
枚举状态
class Solution {
public int countMaxOrSubsets(int[] nums) {
if (nums == null || nums.length == 0) {
return 0;
}
int maxVal = 0;
int maxCnt = 0;
for (int i = 0; i < (1 << nums.length); ++i) {
int orVal = 0;
for (int j = 0; j < nums.length; ++j) {
if (((i >> j) & 1) == 1) {
orVal |= nums[j];
}
}
if (orVal > maxVal) {
maxVal = orVal;
maxCnt = 1;
} else if (orVal == maxVal) {
maxCnt++;
}
}
return maxCnt;
}
}
回溯
class Solution {
private int maxVal = 0;
private int maxCnt = 0;
private void solve(int[] nums, int index, int orVal) {
if (index == nums.length) {
if (orVal > maxVal) {
maxVal = orVal;
maxCnt = 1;
} else if (orVal == maxVal) {
maxCnt++;
}
return;
}
solve(nums, index + 1, orVal);
solve(nums, index + 1, orVal | nums[index]);
}
public int countMaxOrSubsets(int[] nums) {
if (nums == null || nums.length == 0) {
return 0;
}
solve(nums, 0, 0);
return maxCnt;
}
}
心之所向,素履以往 生如逆旅,一苇以航
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理