diff --git a/solution/1300-1399/1395.Count Number of Teams/README.md b/solution/1300-1399/1395.Count Number of Teams/README.md index 12b866f755861..13ac64ce256e9 100644 --- a/solution/1300-1399/1395.Count Number of Teams/README.md +++ b/solution/1300-1399/1395.Count Number of Teams/README.md @@ -527,4 +527,108 @@ function numTeams(rating: number[]): number { + + +### 方法三:记忆化搜索 + + + +#### TypeScript + +```ts +function numTeams(rating: number[]): number { + const n = rating.length; + const f: Record = { + asc: Array.from({ length: n }, () => Array(3).fill(-1)), + desc: Array.from({ length: n }, () => Array(3).fill(-1)), + }; + + const fn = (i: number, available: number, type: Type) => { + if (!available) { + return 1; + } + if (f[type][i][available] !== -1) { + return f[type][i][available]; + } + + let ans = 0; + for (let j = i + 1; j < n; j++) { + if (rating[j] > rating[i]) { + if (type === 'asc') { + ans += fn(j, available - 1, 'asc'); + } + } else { + if (type === 'desc') { + ans += fn(j, available - 1, 'desc'); + } + } + } + f[type][i][available] = ans; + + return ans; + }; + + let ans = 0; + for (let i = 0; i < n; i++) { + ans += fn(i, 2, 'asc') + fn(i, 2, 'desc'); + } + + return ans; +} + +type Type = 'asc' | 'desc'; +``` + +#### JavaScript + +```js +/** + * @param {number[]} rating + * @return {number} + */ +var numTeams = function (rating) { + const n = rating.length; + const f = { + asc: Array.from({ length: n }, () => Array(3).fill(-1)), + desc: Array.from({ length: n }, () => Array(3).fill(-1)), + }; + + const fn = (i, available, type) => { + if (!available) { + return 1; + } + if (f[type][i][available] !== -1) { + return f[type][i][available]; + } + + let ans = 0; + for (let j = i + 1; j < n; j++) { + if (rating[j] > rating[i]) { + if (type === 'asc') { + ans += fn(j, available - 1, 'asc'); + } + } else { + if (type === 'desc') { + ans += fn(j, available - 1, 'desc'); + } + } + } + f[type][i][available] = ans; + + return ans; + }; + + let ans = 0; + for (let i = 0; i < n; i++) { + ans += fn(i, 2, 'asc') + fn(i, 2, 'desc'); + } + + return ans; +}; +``` + + + + + diff --git a/solution/1300-1399/1395.Count Number of Teams/README_EN.md b/solution/1300-1399/1395.Count Number of Teams/README_EN.md index bb1d7b846fc65..bf4b79c3da5a9 100644 --- a/solution/1300-1399/1395.Count Number of Teams/README_EN.md +++ b/solution/1300-1399/1395.Count Number of Teams/README_EN.md @@ -37,7 +37,7 @@ tags:
 Input: rating = [2,5,3,4,1]
 Output: 3
-Explanation: We can form three teams given the conditions. (2,3,4), (5,4,1), (5,3,1). 
+Explanation: We can form three teams given the conditions. (2,3,4), (5,4,1), (5,3,1).
 

Example 2:

@@ -525,4 +525,108 @@ function numTeams(rating: number[]): number { + + +### Solution 3: Recursion + Memoization + + + +#### TypeScript + +```ts +function numTeams(rating: number[]): number { + const n = rating.length; + const f: Record = { + asc: Array.from({ length: n }, () => Array(3).fill(-1)), + desc: Array.from({ length: n }, () => Array(3).fill(-1)), + }; + + const fn = (i: number, available: number, type: Type) => { + if (!available) { + return 1; + } + if (f[type][i][available] !== -1) { + return f[type][i][available]; + } + + let ans = 0; + for (let j = i + 1; j < n; j++) { + if (rating[j] > rating[i]) { + if (type === 'asc') { + ans += fn(j, available - 1, 'asc'); + } + } else { + if (type === 'desc') { + ans += fn(j, available - 1, 'desc'); + } + } + } + f[type][i][available] = ans; + + return ans; + }; + + let ans = 0; + for (let i = 0; i < n; i++) { + ans += fn(i, 2, 'asc') + fn(i, 2, 'desc'); + } + + return ans; +} + +type Type = 'asc' | 'desc'; +``` + +#### JavaScript + +```js +/** + * @param {number[]} rating + * @return {number} + */ +var numTeams = function (rating) { + const n = rating.length; + const f = { + asc: Array.from({ length: n }, () => Array(3).fill(-1)), + desc: Array.from({ length: n }, () => Array(3).fill(-1)), + }; + + const fn = (i, available, type) => { + if (!available) { + return 1; + } + if (f[type][i][available] !== -1) { + return f[type][i][available]; + } + + let ans = 0; + for (let j = i + 1; j < n; j++) { + if (rating[j] > rating[i]) { + if (type === 'asc') { + ans += fn(j, available - 1, 'asc'); + } + } else { + if (type === 'desc') { + ans += fn(j, available - 1, 'desc'); + } + } + } + f[type][i][available] = ans; + + return ans; + }; + + let ans = 0; + for (let i = 0; i < n; i++) { + ans += fn(i, 2, 'asc') + fn(i, 2, 'desc'); + } + + return ans; +}; +``` + + + + + diff --git a/solution/1300-1399/1395.Count Number of Teams/Solution3.js b/solution/1300-1399/1395.Count Number of Teams/Solution3.js new file mode 100644 index 0000000000000..46afa695a39a8 --- /dev/null +++ b/solution/1300-1399/1395.Count Number of Teams/Solution3.js @@ -0,0 +1,43 @@ +/** + * @param {number[]} rating + * @return {number} + */ +var numTeams = function (rating) { + const n = rating.length; + const f = { + asc: Array.from({ length: n }, () => Array(3).fill(-1)), + desc: Array.from({ length: n }, () => Array(3).fill(-1)), + }; + + const fn = (i, available, type) => { + if (!available) { + return 1; + } + if (f[type][i][available] !== -1) { + return f[type][i][available]; + } + + let ans = 0; + for (let j = i + 1; j < n; j++) { + if (rating[j] > rating[i]) { + if (type === 'asc') { + ans += fn(j, available - 1, 'asc'); + } + } else { + if (type === 'desc') { + ans += fn(j, available - 1, 'desc'); + } + } + } + f[type][i][available] = ans; + + return ans; + }; + + let ans = 0; + for (let i = 0; i < n; i++) { + ans += fn(i, 2, 'asc') + fn(i, 2, 'desc'); + } + + return ans; +}; diff --git a/solution/1300-1399/1395.Count Number of Teams/Solution3.ts b/solution/1300-1399/1395.Count Number of Teams/Solution3.ts new file mode 100644 index 0000000000000..34e3bcfc59e85 --- /dev/null +++ b/solution/1300-1399/1395.Count Number of Teams/Solution3.ts @@ -0,0 +1,41 @@ +function numTeams(rating: number[]): number { + const n = rating.length; + const f: Record = { + asc: Array.from({ length: n }, () => Array(3).fill(-1)), + desc: Array.from({ length: n }, () => Array(3).fill(-1)), + }; + + const fn = (i: number, available: number, type: Type) => { + if (!available) { + return 1; + } + if (f[type][i][available] !== -1) { + return f[type][i][available]; + } + + let ans = 0; + for (let j = i + 1; j < n; j++) { + if (rating[j] > rating[i]) { + if (type === 'asc') { + ans += fn(j, available - 1, 'asc'); + } + } else { + if (type === 'desc') { + ans += fn(j, available - 1, 'desc'); + } + } + } + f[type][i][available] = ans; + + return ans; + }; + + let ans = 0; + for (let i = 0; i < n; i++) { + ans += fn(i, 2, 'asc') + fn(i, 2, 'desc'); + } + + return ans; +} + +type Type = 'asc' | 'desc';