Skip to content

Commit 567da37

Browse files
committed
feat: add solutions to lc problem: No.2044
No.2044.Count Number of Maximum Bitwise-OR Subsets
1 parent bb161b4 commit 567da37

File tree

2 files changed

+196
-0
lines changed

2 files changed

+196
-0
lines changed

solution/2000-2099/2044.Count Number of Maximum Bitwise-OR Subsets/README.md

+98
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,8 @@
5858

5959
<!-- 这里可写通用的实现逻辑 -->
6060

61+
简单 DFS。可以预先算出按位或的最大值 mx,然后 DFS 搜索按位或结果等于 mx 的所有子集数。也可以在 DFS 搜索中逐渐更新 mx 与对应的子集数。
62+
6163
<!-- tabs:start -->
6264

6365
### **Python3**
@@ -84,6 +86,25 @@ class Solution:
8486
return ans
8587
```
8688

89+
```python
90+
class Solution:
91+
def countMaxOrSubsets(self, nums: List[int]) -> int:
92+
def dfs(u, t):
93+
nonlocal ans, mx
94+
if u == len(nums):
95+
if t > mx:
96+
mx, ans = t, 1
97+
elif t == mx:
98+
ans += 1
99+
return
100+
dfs(u + 1, t | nums[u])
101+
dfs(u + 1, t)
102+
103+
ans = mx = 0
104+
dfs(0, 0)
105+
return ans
106+
```
107+
87108
### **Java**
88109

89110
<!-- 这里可写当前语言的特殊实现逻辑 -->
@@ -117,6 +138,34 @@ class Solution {
117138
}
118139
```
119140

141+
```java
142+
class Solution {
143+
private int mx;
144+
private int ans;
145+
private int[] nums;
146+
147+
public int countMaxOrSubsets(int[] nums) {
148+
this.nums = nums;
149+
dfs(0, 0);
150+
return ans;
151+
}
152+
153+
private void dfs(int u, int t) {
154+
if (u == nums.length) {
155+
if (t > mx) {
156+
mx = t;
157+
ans = 1;
158+
} else if (t == mx) {
159+
++ans;
160+
}
161+
return;
162+
}
163+
dfs(u + 1, t);
164+
dfs(u + 1, t | nums[u]);
165+
}
166+
}
167+
```
168+
120169
### **TypeScript**
121170

122171
```ts
@@ -194,6 +243,34 @@ public:
194243
};
195244
```
196245
246+
```cpp
247+
class Solution {
248+
public:
249+
int mx;
250+
int ans;
251+
252+
int countMaxOrSubsets(vector<int>& nums) {
253+
dfs(0, 0, nums);
254+
return ans;
255+
}
256+
257+
void dfs(int u, int t, vector<int>& nums) {
258+
if (u == nums.size())
259+
{
260+
if (t > mx)
261+
{
262+
mx = t;
263+
ans = 1;
264+
}
265+
else if (t == mx) ++ans;
266+
return;
267+
}
268+
dfs(u + 1, t, nums);
269+
dfs(u + 1, t | nums[u], nums);
270+
}
271+
};
272+
```
273+
197274
### **Go**
198275

199276
```go
@@ -220,6 +297,27 @@ func countMaxOrSubsets(nums []int) int {
220297
}
221298
```
222299

300+
```go
301+
func countMaxOrSubsets(nums []int) int {
302+
mx, ans := 0, 0
303+
var dfs func(u, t int)
304+
dfs = func(u, t int) {
305+
if u == len(nums) {
306+
if t > mx {
307+
mx, ans = t, 1
308+
} else if t == mx {
309+
ans++
310+
}
311+
return
312+
}
313+
dfs(u+1, t)
314+
dfs(u+1, t|nums[u])
315+
}
316+
dfs(0, 0)
317+
return ans
318+
}
319+
```
320+
223321
### **Rust**
224322

225323
```rust

solution/2000-2099/2044.Count Number of Maximum Bitwise-OR Subsets/README_EN.md

+98
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,8 @@
5252

5353
## Solutions
5454

55+
DFS.
56+
5557
<!-- tabs:start -->
5658

5759
### **Python3**
@@ -76,6 +78,25 @@ class Solution:
7678
return ans
7779
```
7880

81+
```python
82+
class Solution:
83+
def countMaxOrSubsets(self, nums: List[int]) -> int:
84+
def dfs(u, t):
85+
nonlocal ans, mx
86+
if u == len(nums):
87+
if t > mx:
88+
mx, ans = t, 1
89+
elif t == mx:
90+
ans += 1
91+
return
92+
dfs(u + 1, t | nums[u])
93+
dfs(u + 1, t)
94+
95+
ans = mx = 0
96+
dfs(0, 0)
97+
return ans
98+
```
99+
79100
### **Java**
80101

81102
```java
@@ -107,6 +128,34 @@ class Solution {
107128
}
108129
```
109130

131+
```java
132+
class Solution {
133+
private int mx;
134+
private int ans;
135+
private int[] nums;
136+
137+
public int countMaxOrSubsets(int[] nums) {
138+
this.nums = nums;
139+
dfs(0, 0);
140+
return ans;
141+
}
142+
143+
private void dfs(int u, int t) {
144+
if (u == nums.length) {
145+
if (t > mx) {
146+
mx = t;
147+
ans = 1;
148+
} else if (t == mx) {
149+
++ans;
150+
}
151+
return;
152+
}
153+
dfs(u + 1, t);
154+
dfs(u + 1, t | nums[u]);
155+
}
156+
}
157+
```
158+
110159
### **TypeScript**
111160

112161
```ts
@@ -184,6 +233,34 @@ public:
184233
};
185234
```
186235
236+
```cpp
237+
class Solution {
238+
public:
239+
int mx;
240+
int ans;
241+
242+
int countMaxOrSubsets(vector<int>& nums) {
243+
dfs(0, 0, nums);
244+
return ans;
245+
}
246+
247+
void dfs(int u, int t, vector<int>& nums) {
248+
if (u == nums.size())
249+
{
250+
if (t > mx)
251+
{
252+
mx = t;
253+
ans = 1;
254+
}
255+
else if (t == mx) ++ans;
256+
return;
257+
}
258+
dfs(u + 1, t, nums);
259+
dfs(u + 1, t | nums[u], nums);
260+
}
261+
};
262+
```
263+
187264
### **Go**
188265

189266
```go
@@ -210,6 +287,27 @@ func countMaxOrSubsets(nums []int) int {
210287
}
211288
```
212289

290+
```go
291+
func countMaxOrSubsets(nums []int) int {
292+
mx, ans := 0, 0
293+
var dfs func(u, t int)
294+
dfs = func(u, t int) {
295+
if u == len(nums) {
296+
if t > mx {
297+
mx, ans = t, 1
298+
} else if t == mx {
299+
ans++
300+
}
301+
return
302+
}
303+
dfs(u+1, t)
304+
dfs(u+1, t|nums[u])
305+
}
306+
dfs(0, 0)
307+
return ans
308+
}
309+
```
310+
213311
### **Rust**
214312

215313
```rust

0 commit comments

Comments
 (0)