Skip to content

Commit 5ad2330

Browse files
authored
feat: add js/ts solution to lc problem: No.1395 (#3349)
1 parent e14fade commit 5ad2330

File tree

4 files changed

+293
-1
lines changed

4 files changed

+293
-1
lines changed

solution/1300-1399/1395.Count Number of Teams/README.md

+104
Original file line numberDiff line numberDiff line change
@@ -527,4 +527,108 @@ function numTeams(rating: number[]): number {
527527

528528
<!-- solution:end -->
529529

530+
<!-- solution:start -->
531+
532+
### 方法三:记忆化搜索
533+
534+
<!-- tabs:start -->
535+
536+
#### TypeScript
537+
538+
```ts
539+
function numTeams(rating: number[]): number {
540+
const n = rating.length;
541+
const f: Record<Type, number[][]> = {
542+
asc: Array.from({ length: n }, () => Array(3).fill(-1)),
543+
desc: Array.from({ length: n }, () => Array(3).fill(-1)),
544+
};
545+
546+
const fn = (i: number, available: number, type: Type) => {
547+
if (!available) {
548+
return 1;
549+
}
550+
if (f[type][i][available] !== -1) {
551+
return f[type][i][available];
552+
}
553+
554+
let ans = 0;
555+
for (let j = i + 1; j < n; j++) {
556+
if (rating[j] > rating[i]) {
557+
if (type === 'asc') {
558+
ans += fn(j, available - 1, 'asc');
559+
}
560+
} else {
561+
if (type === 'desc') {
562+
ans += fn(j, available - 1, 'desc');
563+
}
564+
}
565+
}
566+
f[type][i][available] = ans;
567+
568+
return ans;
569+
};
570+
571+
let ans = 0;
572+
for (let i = 0; i < n; i++) {
573+
ans += fn(i, 2, 'asc') + fn(i, 2, 'desc');
574+
}
575+
576+
return ans;
577+
}
578+
579+
type Type = 'asc' | 'desc';
580+
```
581+
582+
#### JavaScript
583+
584+
```js
585+
/**
586+
* @param {number[]} rating
587+
* @return {number}
588+
*/
589+
var numTeams = function (rating) {
590+
const n = rating.length;
591+
const f = {
592+
asc: Array.from({ length: n }, () => Array(3).fill(-1)),
593+
desc: Array.from({ length: n }, () => Array(3).fill(-1)),
594+
};
595+
596+
const fn = (i, available, type) => {
597+
if (!available) {
598+
return 1;
599+
}
600+
if (f[type][i][available] !== -1) {
601+
return f[type][i][available];
602+
}
603+
604+
let ans = 0;
605+
for (let j = i + 1; j < n; j++) {
606+
if (rating[j] > rating[i]) {
607+
if (type === 'asc') {
608+
ans += fn(j, available - 1, 'asc');
609+
}
610+
} else {
611+
if (type === 'desc') {
612+
ans += fn(j, available - 1, 'desc');
613+
}
614+
}
615+
}
616+
f[type][i][available] = ans;
617+
618+
return ans;
619+
};
620+
621+
let ans = 0;
622+
for (let i = 0; i < n; i++) {
623+
ans += fn(i, 2, 'asc') + fn(i, 2, 'desc');
624+
}
625+
626+
return ans;
627+
};
628+
```
629+
630+
<!-- tabs:end -->
631+
632+
<!-- solution:end -->
633+
530634
<!-- problem:end -->

solution/1300-1399/1395.Count Number of Teams/README_EN.md

+105-1
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ tags:
3737
<pre>
3838
<strong>Input:</strong> rating = [2,5,3,4,1]
3939
<strong>Output:</strong> 3
40-
<strong>Explanation:</strong> We can form three teams given the conditions. (2,3,4), (5,4,1), (5,3,1).
40+
<strong>Explanation:</strong> We can form three teams given the conditions. (2,3,4), (5,4,1), (5,3,1).
4141
</pre>
4242

4343
<p><strong class="example">Example 2:</strong></p>
@@ -525,4 +525,108 @@ function numTeams(rating: number[]): number {
525525

526526
<!-- solution:end -->
527527

528+
<!-- solution:start -->
529+
530+
### Solution 3: Recursion + Memoization
531+
532+
<!-- tabs:start -->
533+
534+
#### TypeScript
535+
536+
```ts
537+
function numTeams(rating: number[]): number {
538+
const n = rating.length;
539+
const f: Record<Type, number[][]> = {
540+
asc: Array.from({ length: n }, () => Array(3).fill(-1)),
541+
desc: Array.from({ length: n }, () => Array(3).fill(-1)),
542+
};
543+
544+
const fn = (i: number, available: number, type: Type) => {
545+
if (!available) {
546+
return 1;
547+
}
548+
if (f[type][i][available] !== -1) {
549+
return f[type][i][available];
550+
}
551+
552+
let ans = 0;
553+
for (let j = i + 1; j < n; j++) {
554+
if (rating[j] > rating[i]) {
555+
if (type === 'asc') {
556+
ans += fn(j, available - 1, 'asc');
557+
}
558+
} else {
559+
if (type === 'desc') {
560+
ans += fn(j, available - 1, 'desc');
561+
}
562+
}
563+
}
564+
f[type][i][available] = ans;
565+
566+
return ans;
567+
};
568+
569+
let ans = 0;
570+
for (let i = 0; i < n; i++) {
571+
ans += fn(i, 2, 'asc') + fn(i, 2, 'desc');
572+
}
573+
574+
return ans;
575+
}
576+
577+
type Type = 'asc' | 'desc';
578+
```
579+
580+
#### JavaScript
581+
582+
```js
583+
/**
584+
* @param {number[]} rating
585+
* @return {number}
586+
*/
587+
var numTeams = function (rating) {
588+
const n = rating.length;
589+
const f = {
590+
asc: Array.from({ length: n }, () => Array(3).fill(-1)),
591+
desc: Array.from({ length: n }, () => Array(3).fill(-1)),
592+
};
593+
594+
const fn = (i, available, type) => {
595+
if (!available) {
596+
return 1;
597+
}
598+
if (f[type][i][available] !== -1) {
599+
return f[type][i][available];
600+
}
601+
602+
let ans = 0;
603+
for (let j = i + 1; j < n; j++) {
604+
if (rating[j] > rating[i]) {
605+
if (type === 'asc') {
606+
ans += fn(j, available - 1, 'asc');
607+
}
608+
} else {
609+
if (type === 'desc') {
610+
ans += fn(j, available - 1, 'desc');
611+
}
612+
}
613+
}
614+
f[type][i][available] = ans;
615+
616+
return ans;
617+
};
618+
619+
let ans = 0;
620+
for (let i = 0; i < n; i++) {
621+
ans += fn(i, 2, 'asc') + fn(i, 2, 'desc');
622+
}
623+
624+
return ans;
625+
};
626+
```
627+
628+
<!-- tabs:end -->
629+
630+
<!-- solution:end -->
631+
528632
<!-- problem:end -->
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
/**
2+
* @param {number[]} rating
3+
* @return {number}
4+
*/
5+
var numTeams = function (rating) {
6+
const n = rating.length;
7+
const f = {
8+
asc: Array.from({ length: n }, () => Array(3).fill(-1)),
9+
desc: Array.from({ length: n }, () => Array(3).fill(-1)),
10+
};
11+
12+
const fn = (i, available, type) => {
13+
if (!available) {
14+
return 1;
15+
}
16+
if (f[type][i][available] !== -1) {
17+
return f[type][i][available];
18+
}
19+
20+
let ans = 0;
21+
for (let j = i + 1; j < n; j++) {
22+
if (rating[j] > rating[i]) {
23+
if (type === 'asc') {
24+
ans += fn(j, available - 1, 'asc');
25+
}
26+
} else {
27+
if (type === 'desc') {
28+
ans += fn(j, available - 1, 'desc');
29+
}
30+
}
31+
}
32+
f[type][i][available] = ans;
33+
34+
return ans;
35+
};
36+
37+
let ans = 0;
38+
for (let i = 0; i < n; i++) {
39+
ans += fn(i, 2, 'asc') + fn(i, 2, 'desc');
40+
}
41+
42+
return ans;
43+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
function numTeams(rating: number[]): number {
2+
const n = rating.length;
3+
const f: Record<Type, number[][]> = {
4+
asc: Array.from({ length: n }, () => Array(3).fill(-1)),
5+
desc: Array.from({ length: n }, () => Array(3).fill(-1)),
6+
};
7+
8+
const fn = (i: number, available: number, type: Type) => {
9+
if (!available) {
10+
return 1;
11+
}
12+
if (f[type][i][available] !== -1) {
13+
return f[type][i][available];
14+
}
15+
16+
let ans = 0;
17+
for (let j = i + 1; j < n; j++) {
18+
if (rating[j] > rating[i]) {
19+
if (type === 'asc') {
20+
ans += fn(j, available - 1, 'asc');
21+
}
22+
} else {
23+
if (type === 'desc') {
24+
ans += fn(j, available - 1, 'desc');
25+
}
26+
}
27+
}
28+
f[type][i][available] = ans;
29+
30+
return ans;
31+
};
32+
33+
let ans = 0;
34+
for (let i = 0; i < n; i++) {
35+
ans += fn(i, 2, 'asc') + fn(i, 2, 'desc');
36+
}
37+
38+
return ans;
39+
}
40+
41+
type Type = 'asc' | 'desc';

0 commit comments

Comments
 (0)