File tree 2 files changed +196
-0
lines changed
solution/2000-2099/2044.Count Number of Maximum Bitwise-OR Subsets
2 files changed +196
-0
lines changed Original file line number Diff line number Diff line change 58
58
59
59
<!-- 这里可写通用的实现逻辑 -->
60
60
61
+ 简单 DFS。可以预先算出按位或的最大值 mx,然后 DFS 搜索按位或结果等于 mx 的所有子集数。也可以在 DFS 搜索中逐渐更新 mx 与对应的子集数。
62
+
61
63
<!-- tabs:start -->
62
64
63
65
### ** Python3**
@@ -84,6 +86,25 @@ class Solution:
84
86
return ans
85
87
```
86
88
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
+
87
108
### ** Java**
88
109
89
110
<!-- 这里可写当前语言的特殊实现逻辑 -->
@@ -117,6 +138,34 @@ class Solution {
117
138
}
118
139
```
119
140
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
+
120
169
### ** TypeScript**
121
170
122
171
``` ts
@@ -194,6 +243,34 @@ public:
194
243
};
195
244
```
196
245
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
+
197
274
### ** Go**
198
275
199
276
``` go
@@ -220,6 +297,27 @@ func countMaxOrSubsets(nums []int) int {
220
297
}
221
298
```
222
299
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
+
223
321
### ** Rust**
224
322
225
323
``` rust
Original file line number Diff line number Diff line change 52
52
53
53
## Solutions
54
54
55
+ DFS.
56
+
55
57
<!-- tabs:start -->
56
58
57
59
### ** Python3**
@@ -76,6 +78,25 @@ class Solution:
76
78
return ans
77
79
```
78
80
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
+
79
100
### ** Java**
80
101
81
102
``` java
@@ -107,6 +128,34 @@ class Solution {
107
128
}
108
129
```
109
130
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
+
110
159
### ** TypeScript**
111
160
112
161
``` ts
@@ -184,6 +233,34 @@ public:
184
233
};
185
234
```
186
235
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
+
187
264
### ** Go**
188
265
189
266
``` go
@@ -210,6 +287,27 @@ func countMaxOrSubsets(nums []int) int {
210
287
}
211
288
```
212
289
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
+
213
311
### ** Rust**
214
312
215
313
``` rust
You can’t perform that action at this time.
0 commit comments