Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 5ad2330

Browse files
authored
feat: add js/ts solution to lc problem: No.1395 (doocs#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‎

Lines changed: 104 additions & 0 deletions
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‎

Lines changed: 105 additions & 1 deletion
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 -->
Lines changed: 43 additions & 0 deletions
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+
};
Lines changed: 41 additions & 0 deletions
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)

AltStyle によって変換されたページ (->オリジナル) /