Skip to content

Commit 24d191c

Browse files
committedMar 29, 2023
feat: add solutions to lc problem: No.1655
No.1655.Distribute Repeating Integers
1 parent e43dd02 commit 24d191c

File tree

7 files changed

+671
-2
lines changed

7 files changed

+671
-2
lines changed
 

‎solution/1600-1699/1655.Distribute Repeating Integers/README.md

+239-1
Original file line numberDiff line numberDiff line change
@@ -60,22 +60,260 @@
6060

6161
<!-- 这里可写通用的实现逻辑 -->
6262

63+
**方法一:状态压缩动态规划 + 子集枚举**
64+
65+
我们先统计数组 $nums$ 中每个数字出现的次数,记录在哈希表 $cnt$ 中,然后将哈希表中的值存入数组 $arr$ 中,我们记数组 $arr$ 的长度为 $n$。
66+
67+
注意到数组 $quantity$ 的长度不超过 $10$,因此,我们可以用一个二进制数表示 $quantity$ 中的一个子集,即数字 $j$ 表示 $quantity$ 中的一个子集,其中 $j$ 的二进制表示中的第 $i$ 位为 $1$ 表示 $quantity$ 中的第 $i$ 个数字被选中,为 $0$ 表示第 $i$ 个数字未被选中。
68+
69+
我们可以预处理出数组 $s$,其中 $s[j]$ 表示 $quantity$ 中子集 $j$ 中所有数字的和。
70+
71+
接下来,我们定义 $f[i][j]$ 表示数组 $arr[0,..i-1]$ 中的数字能否成功分配给 $quantity$ 中的子集 $j$,其中 $i$ 的取值范围为 $[0,..n-1]$,而 $j$ 的取值范围为 $[0,2^m-1]$,其中 $m$ 为 $quantity$ 的长度。
72+
73+
考虑 $f[i][j]$,如果子集 $j$ 中存在一个子集 $k$,使得 $s[k] \leq arr[i]$,并且 $f[i-1][j \oplus k]$ 为真,那么 $f[i][j]$ 为真,否则 $f[i][j]$ 为假。
74+
75+
答案为 $f[n-1][2^m-1]$。
76+
77+
时间复杂度 $O(n \times 3^m)$,空间复杂度 $O(n \times 2^m)$。其中 $n$ 是数组 $nums$ 中不同整数的个数;而 $m$ 是数组 $quantity$ 的长度。
78+
6379
<!-- tabs:start -->
6480

6581
### **Python3**
6682

6783
<!-- 这里可写当前语言的特殊实现逻辑 -->
6884

6985
```python
70-
86+
class Solution:
87+
def canDistribute(self, nums: List[int], quantity: List[int]) -> bool:
88+
m = len(quantity)
89+
s = [0] * (1 << m)
90+
for i in range(1, 1 << m):
91+
for j in range(m):
92+
if i >> j & 1:
93+
s[i] = s[i ^ (1 << j)] + quantity[j]
94+
break
95+
cnt = Counter(nums)
96+
arr = list(cnt.values())
97+
n = len(arr)
98+
f = [[False] * (1 << m) for _ in range(n)]
99+
for i in range(n):
100+
f[i][0] = True
101+
for i, x in enumerate(arr):
102+
for j in range(1, 1 << m):
103+
if i and f[i - 1][j]:
104+
f[i][j] = True
105+
continue
106+
k = j
107+
while k:
108+
ok1 = j == k if i == 0 else f[i - 1][j ^ k]
109+
ok2 = s[k] <= x
110+
if ok1 and ok2:
111+
f[i][j] = True
112+
break
113+
k = (k - 1) & j
114+
return f[-1][-1]
71115
```
72116

73117
### **Java**
74118

75119
<!-- 这里可写当前语言的特殊实现逻辑 -->
76120

77121
```java
122+
class Solution {
123+
public boolean canDistribute(int[] nums, int[] quantity) {
124+
int m = quantity.length;
125+
int[] s = new int[1 << m];
126+
for (int i = 1; i < 1 << m; ++i) {
127+
for (int j = 0; j < m; ++j) {
128+
if ((i >> j & 1) != 0) {
129+
s[i] = s[i ^ (1 << j)] + quantity[j];
130+
break;
131+
}
132+
}
133+
}
134+
Map<Integer, Integer> cnt = new HashMap<>(50);
135+
for (int x : nums) {
136+
cnt.merge(x, 1, Integer::sum);
137+
}
138+
int n = cnt.size();
139+
int[] arr = new int[n];
140+
int i = 0;
141+
for (int x : cnt.values()) {
142+
arr[i++] = x;
143+
}
144+
boolean[][] f = new boolean[n][1 << m];
145+
for (i = 0; i < n; ++i) {
146+
f[i][0] = true;
147+
}
148+
for (i = 0; i < n; ++i) {
149+
for (int j = 1; j < 1 << m; ++j) {
150+
if (i > 0 && f[i - 1][j]) {
151+
f[i][j] = true;
152+
continue;
153+
}
154+
for (int k = j; k > 0; k = (k - 1) & j) {
155+
boolean ok1 = i == 0 ? j == k : f[i - 1][j ^ k];
156+
boolean ok2 = s[k] <= arr[i];
157+
if (ok1 && ok2) {
158+
f[i][j] = true;
159+
break;
160+
}
161+
}
162+
}
163+
}
164+
return f[n - 1][(1 << m) - 1];
165+
}
166+
}
167+
```
168+
169+
### **C++**
170+
171+
```cpp
172+
class Solution {
173+
public:
174+
bool canDistribute(vector<int>& nums, vector<int>& quantity) {
175+
int m = quantity.size();
176+
int s[1 << m];
177+
memset(s, 0, sizeof(s));
178+
for (int i = 1; i < 1 << m; ++i) {
179+
for (int j = 0; j < m; ++j) {
180+
if (i >> j & 1) {
181+
s[i] = s[i ^ (1 << j)] + quantity[j];
182+
break;
183+
}
184+
}
185+
}
186+
unordered_map<int, int> cnt;
187+
for (int& x : nums) {
188+
++cnt[x];
189+
}
190+
int n = cnt.size();
191+
vector<int> arr;
192+
for (auto& [_, x] : cnt) {
193+
arr.push_back(x);
194+
}
195+
bool f[n][1 << m];
196+
memset(f, 0, sizeof(f));
197+
for (int i = 0; i < n; ++i) {
198+
f[i][0] = true;
199+
}
200+
for (int i = 0; i < n; ++i) {
201+
for (int j = 1; j < 1 << m; ++j) {
202+
if (i && f[i - 1][j]) {
203+
f[i][j] = true;
204+
continue;
205+
}
206+
for (int k = j; k; k = (k - 1) & j) {
207+
bool ok1 = i == 0 ? j == k : f[i - 1][j ^ k];
208+
bool ok2 = s[k] <= arr[i];
209+
if (ok1 && ok2) {
210+
f[i][j] = true;
211+
break;
212+
}
213+
}
214+
}
215+
}
216+
return f[n - 1][(1 << m) - 1];
217+
}
218+
};
219+
```
220+
221+
### **Go**
222+
223+
```go
224+
func canDistribute(nums []int, quantity []int) bool {
225+
m := len(quantity)
226+
s := make([]int, 1<<m)
227+
for i := 1; i < 1<<m; i++ {
228+
for j := 0; j < m; j++ {
229+
if i>>j&1 == 1 {
230+
s[i] = s[i^(1<<j)] + quantity[j]
231+
break
232+
}
233+
}
234+
}
235+
cnt := map[int]int{}
236+
for _, x := range nums {
237+
cnt[x]++
238+
}
239+
n := len(cnt)
240+
arr := make([]int, 0, n)
241+
for _, x := range cnt {
242+
arr = append(arr, x)
243+
}
244+
f := make([][]bool, n)
245+
for i := range f {
246+
f[i] = make([]bool, 1<<m)
247+
f[i][0] = true
248+
}
249+
for i := 0; i < n; i++ {
250+
for j := 0; j < 1<<m; j++ {
251+
if i > 0 && f[i-1][j] {
252+
f[i][j] = true
253+
continue
254+
}
255+
for k := j; k > 0; k = (k - 1) & j {
256+
ok1 := (i == 0 && j == k) || (i > 0 && f[i-1][j-k])
257+
ok2 := s[k] <= arr[i]
258+
if ok1 && ok2 {
259+
f[i][j] = true
260+
break
261+
}
262+
}
263+
}
264+
}
265+
return f[n-1][(1<<m)-1]
266+
}
267+
```
268+
269+
### **TypeScript**
78270

271+
```ts
272+
function canDistribute(nums: number[], quantity: number[]): boolean {
273+
const m = quantity.length;
274+
const s: number[] = new Array(1 << m).fill(0);
275+
for (let i = 1; i < 1 << m; ++i) {
276+
for (let j = 0; j < m; ++j) {
277+
if ((i >> j) & 1) {
278+
s[i] = s[i ^ (1 << j)] + quantity[j];
279+
break;
280+
}
281+
}
282+
}
283+
const cnt: Map<number, number> = new Map();
284+
for (const x of nums) {
285+
cnt.set(x, (cnt.get(x) || 0) + 1);
286+
}
287+
const n = cnt.size;
288+
const arr: number[] = [];
289+
for (const [_, v] of cnt) {
290+
arr.push(v);
291+
}
292+
const f: boolean[][] = new Array(n)
293+
.fill(false)
294+
.map(() => new Array(1 << m).fill(false));
295+
for (let i = 0; i < n; ++i) {
296+
f[i][0] = true;
297+
}
298+
for (let i = 0; i < n; ++i) {
299+
for (let j = 0; j < 1 << m; ++j) {
300+
if (i > 0 && f[i - 1][j]) {
301+
f[i][j] = true;
302+
continue;
303+
}
304+
for (let k = j; k > 0; k = (k - 1) & j) {
305+
const ok1: boolean =
306+
(i == 0 && j == k) || (i > 0 && f[i - 1][j ^ k]);
307+
const ok2: boolean = s[k] <= arr[i];
308+
if (ok1 && ok2) {
309+
f[i][j] = true;
310+
break;
311+
}
312+
}
313+
}
314+
}
315+
return f[n - 1][(1 << m) - 1];
316+
}
79317
```
80318

81319
### **...**

‎solution/1600-1699/1655.Distribute Repeating Integers/README_EN.md

+223-1
Original file line numberDiff line numberDiff line change
@@ -59,13 +59,235 @@
5959
### **Python3**
6060

6161
```python
62-
62+
class Solution:
63+
def canDistribute(self, nums: List[int], quantity: List[int]) -> bool:
64+
m = len(quantity)
65+
s = [0] * (1 << m)
66+
for i in range(1, 1 << m):
67+
for j in range(m):
68+
if i >> j & 1:
69+
s[i] = s[i ^ (1 << j)] + quantity[j]
70+
break
71+
cnt = Counter(nums)
72+
arr = list(cnt.values())
73+
n = len(arr)
74+
f = [[False] * (1 << m) for _ in range(n)]
75+
for i in range(n):
76+
f[i][0] = True
77+
for i, x in enumerate(arr):
78+
for j in range(1, 1 << m):
79+
if i and f[i - 1][j]:
80+
f[i][j] = True
81+
continue
82+
k = j
83+
while k:
84+
ok1 = j == k if i == 0 else f[i - 1][j ^ k]
85+
ok2 = s[k] <= x
86+
if ok1 and ok2:
87+
f[i][j] = True
88+
break
89+
k = (k - 1) & j
90+
return f[-1][-1]
6391
```
6492

6593
### **Java**
6694

6795
```java
96+
class Solution {
97+
public boolean canDistribute(int[] nums, int[] quantity) {
98+
int m = quantity.length;
99+
int[] s = new int[1 << m];
100+
for (int i = 1; i < 1 << m; ++i) {
101+
for (int j = 0; j < m; ++j) {
102+
if ((i >> j & 1) != 0) {
103+
s[i] = s[i ^ (1 << j)] + quantity[j];
104+
break;
105+
}
106+
}
107+
}
108+
Map<Integer, Integer> cnt = new HashMap<>(50);
109+
for (int x : nums) {
110+
cnt.merge(x, 1, Integer::sum);
111+
}
112+
int n = cnt.size();
113+
int[] arr = new int[n];
114+
int i = 0;
115+
for (int x : cnt.values()) {
116+
arr[i++] = x;
117+
}
118+
boolean[][] f = new boolean[n][1 << m];
119+
for (i = 0; i < n; ++i) {
120+
f[i][0] = true;
121+
}
122+
for (i = 0; i < n; ++i) {
123+
for (int j = 1; j < 1 << m; ++j) {
124+
if (i > 0 && f[i - 1][j]) {
125+
f[i][j] = true;
126+
continue;
127+
}
128+
for (int k = j; k > 0; k = (k - 1) & j) {
129+
boolean ok1 = i == 0 ? j == k : f[i - 1][j ^ k];
130+
boolean ok2 = s[k] <= arr[i];
131+
if (ok1 && ok2) {
132+
f[i][j] = true;
133+
break;
134+
}
135+
}
136+
}
137+
}
138+
return f[n - 1][(1 << m) - 1];
139+
}
140+
}
141+
```
142+
143+
### **C++**
144+
145+
```cpp
146+
class Solution {
147+
public:
148+
bool canDistribute(vector<int>& nums, vector<int>& quantity) {
149+
int m = quantity.size();
150+
int s[1 << m];
151+
memset(s, 0, sizeof(s));
152+
for (int i = 1; i < 1 << m; ++i) {
153+
for (int j = 0; j < m; ++j) {
154+
if (i >> j & 1) {
155+
s[i] = s[i ^ (1 << j)] + quantity[j];
156+
break;
157+
}
158+
}
159+
}
160+
unordered_map<int, int> cnt;
161+
for (int& x : nums) {
162+
++cnt[x];
163+
}
164+
int n = cnt.size();
165+
vector<int> arr;
166+
for (auto& [_, x] : cnt) {
167+
arr.push_back(x);
168+
}
169+
bool f[n][1 << m];
170+
memset(f, 0, sizeof(f));
171+
for (int i = 0; i < n; ++i) {
172+
f[i][0] = true;
173+
}
174+
for (int i = 0; i < n; ++i) {
175+
for (int j = 1; j < 1 << m; ++j) {
176+
if (i && f[i - 1][j]) {
177+
f[i][j] = true;
178+
continue;
179+
}
180+
for (int k = j; k; k = (k - 1) & j) {
181+
bool ok1 = i == 0 ? j == k : f[i - 1][j ^ k];
182+
bool ok2 = s[k] <= arr[i];
183+
if (ok1 && ok2) {
184+
f[i][j] = true;
185+
break;
186+
}
187+
}
188+
}
189+
}
190+
return f[n - 1][(1 << m) - 1];
191+
}
192+
};
193+
```
194+
195+
### **Go**
196+
197+
```go
198+
func canDistribute(nums []int, quantity []int) bool {
199+
m := len(quantity)
200+
s := make([]int, 1<<m)
201+
for i := 1; i < 1<<m; i++ {
202+
for j := 0; j < m; j++ {
203+
if i>>j&1 == 1 {
204+
s[i] = s[i^(1<<j)] + quantity[j]
205+
break
206+
}
207+
}
208+
}
209+
cnt := map[int]int{}
210+
for _, x := range nums {
211+
cnt[x]++
212+
}
213+
n := len(cnt)
214+
arr := make([]int, 0, n)
215+
for _, x := range cnt {
216+
arr = append(arr, x)
217+
}
218+
f := make([][]bool, n)
219+
for i := range f {
220+
f[i] = make([]bool, 1<<m)
221+
f[i][0] = true
222+
}
223+
for i := 0; i < n; i++ {
224+
for j := 0; j < 1<<m; j++ {
225+
if i > 0 && f[i-1][j] {
226+
f[i][j] = true
227+
continue
228+
}
229+
for k := j; k > 0; k = (k - 1) & j {
230+
ok1 := (i == 0 && j == k) || (i > 0 && f[i-1][j-k])
231+
ok2 := s[k] <= arr[i]
232+
if ok1 && ok2 {
233+
f[i][j] = true
234+
break
235+
}
236+
}
237+
}
238+
}
239+
return f[n-1][(1<<m)-1]
240+
}
241+
```
242+
243+
### **TypeScript**
68244

245+
```ts
246+
function canDistribute(nums: number[], quantity: number[]): boolean {
247+
const m = quantity.length;
248+
const s: number[] = new Array(1 << m).fill(0);
249+
for (let i = 1; i < 1 << m; ++i) {
250+
for (let j = 0; j < m; ++j) {
251+
if ((i >> j) & 1) {
252+
s[i] = s[i ^ (1 << j)] + quantity[j];
253+
break;
254+
}
255+
}
256+
}
257+
const cnt: Map<number, number> = new Map();
258+
for (const x of nums) {
259+
cnt.set(x, (cnt.get(x) || 0) + 1);
260+
}
261+
const n = cnt.size;
262+
const arr: number[] = [];
263+
for (const [_, v] of cnt) {
264+
arr.push(v);
265+
}
266+
const f: boolean[][] = new Array(n)
267+
.fill(false)
268+
.map(() => new Array(1 << m).fill(false));
269+
for (let i = 0; i < n; ++i) {
270+
f[i][0] = true;
271+
}
272+
for (let i = 0; i < n; ++i) {
273+
for (let j = 0; j < 1 << m; ++j) {
274+
if (i > 0 && f[i - 1][j]) {
275+
f[i][j] = true;
276+
continue;
277+
}
278+
for (let k = j; k > 0; k = (k - 1) & j) {
279+
const ok1: boolean =
280+
(i == 0 && j == k) || (i > 0 && f[i - 1][j ^ k]);
281+
const ok2: boolean = s[k] <= arr[i];
282+
if (ok1 && ok2) {
283+
f[i][j] = true;
284+
break;
285+
}
286+
}
287+
}
288+
}
289+
return f[n - 1][(1 << m) - 1];
290+
}
69291
```
70292

71293
### **...**
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
class Solution {
2+
public:
3+
bool canDistribute(vector<int>& nums, vector<int>& quantity) {
4+
int m = quantity.size();
5+
int s[1 << m];
6+
memset(s, 0, sizeof(s));
7+
for (int i = 1; i < 1 << m; ++i) {
8+
for (int j = 0; j < m; ++j) {
9+
if (i >> j & 1) {
10+
s[i] = s[i ^ (1 << j)] + quantity[j];
11+
break;
12+
}
13+
}
14+
}
15+
unordered_map<int, int> cnt;
16+
for (int& x : nums) {
17+
++cnt[x];
18+
}
19+
int n = cnt.size();
20+
vector<int> arr;
21+
for (auto& [_, x] : cnt) {
22+
arr.push_back(x);
23+
}
24+
bool f[n][1 << m];
25+
memset(f, 0, sizeof(f));
26+
for (int i = 0; i < n; ++i) {
27+
f[i][0] = true;
28+
}
29+
for (int i = 0; i < n; ++i) {
30+
for (int j = 1; j < 1 << m; ++j) {
31+
if (i && f[i - 1][j]) {
32+
f[i][j] = true;
33+
continue;
34+
}
35+
for (int k = j; k; k = (k - 1) & j) {
36+
bool ok1 = i == 0 ? j == k : f[i - 1][j ^ k];
37+
bool ok2 = s[k] <= arr[i];
38+
if (ok1 && ok2) {
39+
f[i][j] = true;
40+
break;
41+
}
42+
}
43+
}
44+
}
45+
return f[n - 1][(1 << m) - 1];
46+
}
47+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
func canDistribute(nums []int, quantity []int) bool {
2+
m := len(quantity)
3+
s := make([]int, 1<<m)
4+
for i := 1; i < 1<<m; i++ {
5+
for j := 0; j < m; j++ {
6+
if i>>j&1 == 1 {
7+
s[i] = s[i^(1<<j)] + quantity[j]
8+
break
9+
}
10+
}
11+
}
12+
cnt := map[int]int{}
13+
for _, x := range nums {
14+
cnt[x]++
15+
}
16+
n := len(cnt)
17+
arr := make([]int, 0, n)
18+
for _, x := range cnt {
19+
arr = append(arr, x)
20+
}
21+
f := make([][]bool, n)
22+
for i := range f {
23+
f[i] = make([]bool, 1<<m)
24+
f[i][0] = true
25+
}
26+
for i := 0; i < n; i++ {
27+
for j := 0; j < 1<<m; j++ {
28+
if i > 0 && f[i-1][j] {
29+
f[i][j] = true
30+
continue
31+
}
32+
for k := j; k > 0; k = (k - 1) & j {
33+
ok1 := (i == 0 && j == k) || (i > 0 && f[i-1][j-k])
34+
ok2 := s[k] <= arr[i]
35+
if ok1 && ok2 {
36+
f[i][j] = true
37+
break
38+
}
39+
}
40+
}
41+
}
42+
return f[n-1][(1<<m)-1]
43+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
class Solution {
2+
public boolean canDistribute(int[] nums, int[] quantity) {
3+
int m = quantity.length;
4+
int[] s = new int[1 << m];
5+
for (int i = 1; i < 1 << m; ++i) {
6+
for (int j = 0; j < m; ++j) {
7+
if ((i >> j & 1) != 0) {
8+
s[i] = s[i ^ (1 << j)] + quantity[j];
9+
break;
10+
}
11+
}
12+
}
13+
Map<Integer, Integer> cnt = new HashMap<>(50);
14+
for (int x : nums) {
15+
cnt.merge(x, 1, Integer::sum);
16+
}
17+
int n = cnt.size();
18+
int[] arr = new int[n];
19+
int i = 0;
20+
for (int x : cnt.values()) {
21+
arr[i++] = x;
22+
}
23+
boolean[][] f = new boolean[n][1 << m];
24+
for (i = 0; i < n; ++i) {
25+
f[i][0] = true;
26+
}
27+
for (i = 0; i < n; ++i) {
28+
for (int j = 1; j < 1 << m; ++j) {
29+
if (i > 0 && f[i - 1][j]) {
30+
f[i][j] = true;
31+
continue;
32+
}
33+
for (int k = j; k > 0; k = (k - 1) & j) {
34+
boolean ok1 = i == 0 ? j == k : f[i - 1][j ^ k];
35+
boolean ok2 = s[k] <= arr[i];
36+
if (ok1 && ok2) {
37+
f[i][j] = true;
38+
break;
39+
}
40+
}
41+
}
42+
}
43+
return f[n - 1][(1 << m) - 1];
44+
}
45+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
class Solution:
2+
def canDistribute(self, nums: List[int], quantity: List[int]) -> bool:
3+
m = len(quantity)
4+
s = [0] * (1 << m)
5+
for i in range(1, 1 << m):
6+
for j in range(m):
7+
if i >> j & 1:
8+
s[i] = s[i ^ (1 << j)] + quantity[j]
9+
break
10+
cnt = Counter(nums)
11+
arr = list(cnt.values())
12+
n = len(arr)
13+
f = [[False] * (1 << m) for _ in range(n)]
14+
for i in range(n):
15+
f[i][0] = True
16+
for i, x in enumerate(arr):
17+
for j in range(1, 1 << m):
18+
if i and f[i - 1][j]:
19+
f[i][j] = True
20+
continue
21+
k = j
22+
while k:
23+
ok1 = j == k if i == 0 else f[i - 1][j ^ k]
24+
ok2 = s[k] <= x
25+
if ok1 and ok2:
26+
f[i][j] = True
27+
break
28+
k = (k - 1) & j
29+
return f[-1][-1]
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
function canDistribute(nums: number[], quantity: number[]): boolean {
2+
const m = quantity.length;
3+
const s: number[] = new Array(1 << m).fill(0);
4+
for (let i = 1; i < 1 << m; ++i) {
5+
for (let j = 0; j < m; ++j) {
6+
if ((i >> j) & 1) {
7+
s[i] = s[i ^ (1 << j)] + quantity[j];
8+
break;
9+
}
10+
}
11+
}
12+
const cnt: Map<number, number> = new Map();
13+
for (const x of nums) {
14+
cnt.set(x, (cnt.get(x) || 0) + 1);
15+
}
16+
const n = cnt.size;
17+
const arr: number[] = [];
18+
for (const [_, v] of cnt) {
19+
arr.push(v);
20+
}
21+
const f: boolean[][] = new Array(n)
22+
.fill(false)
23+
.map(() => new Array(1 << m).fill(false));
24+
for (let i = 0; i < n; ++i) {
25+
f[i][0] = true;
26+
}
27+
for (let i = 0; i < n; ++i) {
28+
for (let j = 0; j < 1 << m; ++j) {
29+
if (i > 0 && f[i - 1][j]) {
30+
f[i][j] = true;
31+
continue;
32+
}
33+
for (let k = j; k > 0; k = (k - 1) & j) {
34+
const ok1: boolean =
35+
(i == 0 && j == k) || (i > 0 && f[i - 1][j ^ k]);
36+
const ok2: boolean = s[k] <= arr[i];
37+
if (ok1 && ok2) {
38+
f[i][j] = true;
39+
break;
40+
}
41+
}
42+
}
43+
}
44+
return f[n - 1][(1 << m) - 1];
45+
}

0 commit comments

Comments
 (0)
Please sign in to comment.