From da05d2ee32a2f0f6a6618555b83ddbf126898695 Mon Sep 17 00:00:00 2001 From: yanglbme Date: Fri, 29 Nov 2024 08:40:59 +0800 Subject: [PATCH] feat: add solutions to lc problems: No.0506,0507 --- .../0500-0599/0506.Relative Ranks/README.md | 49 ++++++++++++++---- .../0506.Relative Ranks/README_EN.md | 49 ++++++++++++++---- .../0506.Relative Ranks/Solution.cpp | 17 ++++--- .../0500-0599/0506.Relative Ranks/Solution.py | 6 +-- .../0500-0599/0506.Relative Ranks/Solution.ts | 15 ++++++ .../0500-0599/0507.Perfect Number/README.md | 51 +++++++++++++++---- .../0507.Perfect Number/README_EN.md | 51 +++++++++++++++---- .../0507.Perfect Number/Solution.cpp | 12 +++-- .../0500-0599/0507.Perfect Number/Solution.go | 8 +-- .../0507.Perfect Number/Solution.java | 5 +- .../0500-0599/0507.Perfect Number/Solution.py | 2 +- .../0500-0599/0507.Perfect Number/Solution.ts | 15 ++++++ 12 files changed, 215 insertions(+), 65 deletions(-) create mode 100644 solution/0500-0599/0506.Relative Ranks/Solution.ts create mode 100644 solution/0500-0599/0507.Perfect Number/Solution.ts diff --git a/solution/0500-0599/0506.Relative Ranks/README.md b/solution/0500-0599/0506.Relative Ranks/README.md index e1dda68c7a730..2f1fa1b09f81b 100644 --- a/solution/0500-0599/0506.Relative Ranks/README.md +++ b/solution/0500-0599/0506.Relative Ranks/README.md @@ -65,7 +65,13 @@ tags: -### 方法一 +### 方法一:排序 + +我们使用一个数组 $\textit{idx}$ 存储 $0$ 到 $n-1$ 的下标,然后对 $\textit{idx}$ 进行排序,排序规则为:按照 $\textit{score}$ 的值从大到小排序。 + +然后我们定义一个数组 $\textit{top3} = [\text{Gold Medal}, \text{Silver Medal}, \text{Bronze Medal}]$,遍历 $\textit{idx}$,对于每个下标 $j$,如果 $j$ 小于 $3$,则 $\textit{ans}[j]$ 为 $\textit{top3}[j]$,否则为 $j+1$。 + +时间复杂度 $O(n \times \log n)$,空间复杂度 $O(n)$。其中 $n$ 为数组 $\textit{score}$ 的长度。 @@ -77,10 +83,10 @@ class Solution: n = len(score) idx = list(range(n)) idx.sort(key=lambda x: -score[x]) - top3 = ['Gold Medal', 'Silver Medal', 'Bronze Medal'] + top3 = ["Gold Medal", "Silver Medal", "Bronze Medal"] ans = [None] * n - for i in range(n): - ans[idx[i]] = top3[i] if i < 3 else str(i + 1) + for i, j in enumerate(idx): + ans[j] = top3[i] if i < 3 else str(i + 1) return ans ``` @@ -112,15 +118,16 @@ class Solution { public: vector findRelativeRanks(vector& score) { int n = score.size(); - vector> idx; - for (int i = 0; i < n; ++i) - idx.push_back(make_pair(score[i], i)); - sort(idx.begin(), idx.end(), - [&](const pair& x, const pair& y) { return x.first > y.first; }); + vector idx(n); + iota(idx.begin(), idx.end(), 0); + sort(idx.begin(), idx.end(), [&score](int a, int b) { + return score[a] > score[b]; + }); vector ans(n); vector top3 = {"Gold Medal", "Silver Medal", "Bronze Medal"}; - for (int i = 0; i < n; ++i) - ans[idx[i].second] = i < 3 ? top3[i] : to_string(i + 1); + for (int i = 0; i < n; ++i) { + ans[idx[i]] = i < 3 ? top3[i] : to_string(i + 1); + } return ans; } }; @@ -151,6 +158,26 @@ func findRelativeRanks(score []int) []string { } ``` +#### TypeScript + +```ts +function findRelativeRanks(score: number[]): string[] { + const n = score.length; + const idx = Array.from({ length: n }, (_, i) => i); + idx.sort((a, b) => score[b] - score[a]); + const top3 = ['Gold Medal', 'Silver Medal', 'Bronze Medal']; + const ans: string[] = Array(n); + for (let i = 0; i < n; i++) { + if (i < 3) { + ans[idx[i]] = top3[i]; + } else { + ans[idx[i]] = (i + 1).toString(); + } + } + return ans; +} +``` + diff --git a/solution/0500-0599/0506.Relative Ranks/README_EN.md b/solution/0500-0599/0506.Relative Ranks/README_EN.md index f5f734129431c..8bb99b92b780c 100644 --- a/solution/0500-0599/0506.Relative Ranks/README_EN.md +++ b/solution/0500-0599/0506.Relative Ranks/README_EN.md @@ -64,7 +64,13 @@ tags: -### Solution 1 +### Solution 1: Sorting + +We use an array $\textit{idx}$ to store the indices from $0$ to $n-1$, then sort $\textit{idx}$ based on the values in $\textit{score}$ in descending order. + +Next, we define an array $\textit{top3} = [\text{Gold Medal}, \text{Silver Medal}, \text{Bronze Medal}]$. We traverse $\textit{idx}$, and for each index $j$, if $j$ is less than $3$, then $\textit{ans}[j]$ is $\textit{top3}[j]$; otherwise, it is $j+1$. + +The time complexity is $O(n \times \log n)$, and the space complexity is $O(n)$. Here, $n$ is the length of the array $\textit{score}$. @@ -76,10 +82,10 @@ class Solution: n = len(score) idx = list(range(n)) idx.sort(key=lambda x: -score[x]) - top3 = ['Gold Medal', 'Silver Medal', 'Bronze Medal'] + top3 = ["Gold Medal", "Silver Medal", "Bronze Medal"] ans = [None] * n - for i in range(n): - ans[idx[i]] = top3[i] if i < 3 else str(i + 1) + for i, j in enumerate(idx): + ans[j] = top3[i] if i < 3 else str(i + 1) return ans ``` @@ -111,15 +117,16 @@ class Solution { public: vector findRelativeRanks(vector& score) { int n = score.size(); - vector> idx; - for (int i = 0; i < n; ++i) - idx.push_back(make_pair(score[i], i)); - sort(idx.begin(), idx.end(), - [&](const pair& x, const pair& y) { return x.first > y.first; }); + vector idx(n); + iota(idx.begin(), idx.end(), 0); + sort(idx.begin(), idx.end(), [&score](int a, int b) { + return score[a] > score[b]; + }); vector ans(n); vector top3 = {"Gold Medal", "Silver Medal", "Bronze Medal"}; - for (int i = 0; i < n; ++i) - ans[idx[i].second] = i < 3 ? top3[i] : to_string(i + 1); + for (int i = 0; i < n; ++i) { + ans[idx[i]] = i < 3 ? top3[i] : to_string(i + 1); + } return ans; } }; @@ -150,6 +157,26 @@ func findRelativeRanks(score []int) []string { } ``` +#### TypeScript + +```ts +function findRelativeRanks(score: number[]): string[] { + const n = score.length; + const idx = Array.from({ length: n }, (_, i) => i); + idx.sort((a, b) => score[b] - score[a]); + const top3 = ['Gold Medal', 'Silver Medal', 'Bronze Medal']; + const ans: string[] = Array(n); + for (let i = 0; i < n; i++) { + if (i < 3) { + ans[idx[i]] = top3[i]; + } else { + ans[idx[i]] = (i + 1).toString(); + } + } + return ans; +} +``` + diff --git a/solution/0500-0599/0506.Relative Ranks/Solution.cpp b/solution/0500-0599/0506.Relative Ranks/Solution.cpp index 72e427deb83d0..e21d5b0c7151f 100644 --- a/solution/0500-0599/0506.Relative Ranks/Solution.cpp +++ b/solution/0500-0599/0506.Relative Ranks/Solution.cpp @@ -2,15 +2,16 @@ class Solution { public: vector findRelativeRanks(vector& score) { int n = score.size(); - vector> idx; - for (int i = 0; i < n; ++i) - idx.push_back(make_pair(score[i], i)); - sort(idx.begin(), idx.end(), - [&](const pair& x, const pair& y) { return x.first > y.first; }); + vector idx(n); + iota(idx.begin(), idx.end(), 0); + sort(idx.begin(), idx.end(), [&score](int a, int b) { + return score[a] > score[b]; + }); vector ans(n); vector top3 = {"Gold Medal", "Silver Medal", "Bronze Medal"}; - for (int i = 0; i < n; ++i) - ans[idx[i].second] = i < 3 ? top3[i] : to_string(i + 1); + for (int i = 0; i < n; ++i) { + ans[idx[i]] = i < 3 ? top3[i] : to_string(i + 1); + } return ans; } -}; \ No newline at end of file +}; diff --git a/solution/0500-0599/0506.Relative Ranks/Solution.py b/solution/0500-0599/0506.Relative Ranks/Solution.py index 34d66062927fa..d83eeb913f890 100644 --- a/solution/0500-0599/0506.Relative Ranks/Solution.py +++ b/solution/0500-0599/0506.Relative Ranks/Solution.py @@ -3,8 +3,8 @@ def findRelativeRanks(self, score: List[int]) -> List[str]: n = len(score) idx = list(range(n)) idx.sort(key=lambda x: -score[x]) - top3 = ['Gold Medal', 'Silver Medal', 'Bronze Medal'] + top3 = ["Gold Medal", "Silver Medal", "Bronze Medal"] ans = [None] * n - for i in range(n): - ans[idx[i]] = top3[i] if i < 3 else str(i + 1) + for i, j in enumerate(idx): + ans[j] = top3[i] if i < 3 else str(i + 1) return ans diff --git a/solution/0500-0599/0506.Relative Ranks/Solution.ts b/solution/0500-0599/0506.Relative Ranks/Solution.ts new file mode 100644 index 0000000000000..1e0ebcddc836f --- /dev/null +++ b/solution/0500-0599/0506.Relative Ranks/Solution.ts @@ -0,0 +1,15 @@ +function findRelativeRanks(score: number[]): string[] { + const n = score.length; + const idx = Array.from({ length: n }, (_, i) => i); + idx.sort((a, b) => score[b] - score[a]); + const top3 = ['Gold Medal', 'Silver Medal', 'Bronze Medal']; + const ans: string[] = Array(n); + for (let i = 0; i < n; i++) { + if (i < 3) { + ans[idx[i]] = top3[i]; + } else { + ans[idx[i]] = (i + 1).toString(); + } + } + return ans; +} diff --git a/solution/0500-0599/0507.Perfect Number/README.md b/solution/0500-0599/0507.Perfect Number/README.md index fadd7253711bb..dd2f67de9b8b2 100644 --- a/solution/0500-0599/0507.Perfect Number/README.md +++ b/solution/0500-0599/0507.Perfect Number/README.md @@ -51,7 +51,15 @@ tags: -### 方法一 +### 方法一:枚举 + +我们首先判断 $\textit{num}$ 是否为 1,如果为 1,则 $\textit{num}$ 不是完美数,返回 $\text{false}$。 + +然后,我们从 2 开始枚举 $\textit{num}$ 的所有正因子,如果 $\textit{num}$ 能被 $\textit{num}$ 的某个正因子 $i$ 整除,那么我们将 $i$ 加入到答案 $\textit{s}$ 中。如果 $\textit{num}$ 除以 $i$ 得到的商不等于 $i$,我们也将 $\textit{num}$ 除以 $i$ 得到的商加入到答案 $\textit{s}$ 中。 + +最后,我们判断 $\textit{s}$ 是否等于 $\textit{num}$ 即可。 + +时间复杂度 $O(\sqrt{n})$,其中 $n$ 为 $\textit{num}$ 的大小。空间复杂度 $O(1)$。 @@ -63,7 +71,7 @@ class Solution: if num == 1: return False s, i = 1, 2 - while i * i <= num: + while i <= num // i: if num % i == 0: s += i if i != num // i: @@ -76,13 +84,12 @@ class Solution: ```java class Solution { - public boolean checkPerfectNumber(int num) { if (num == 1) { return false; } int s = 1; - for (int i = 2; i * i <= num; ++i) { + for (int i = 2; i <= num / i; ++i) { if (num % i == 0) { s += i; if (i != num / i) { @@ -101,12 +108,16 @@ class Solution { class Solution { public: bool checkPerfectNumber(int num) { - if (num == 1) return false; + if (num == 1) { + return false; + } int s = 1; - for (int i = 2; i * i <= num; ++i) { + for (int i = 2; i <= num / i; ++i) { if (num % i == 0) { s += i; - if (i != num / i) s += num / i; + if (i != num / i) { + s += num / i; + } } } return s == num; @@ -122,11 +133,11 @@ func checkPerfectNumber(num int) bool { return false } s := 1 - for i := 2; i*i <= num; i++ { + for i := 2; i <= num/i; i++ { if num%i == 0 { s += i - if i != num/i { - s += num / i + if j := num / i; i != j { + s += j } } } @@ -134,6 +145,26 @@ func checkPerfectNumber(num int) bool { } ``` +#### TypeScript + +```ts +function checkPerfectNumber(num: number): boolean { + if (num <= 1) { + return false; + } + let s = 1; + for (let i = 2; i <= num / i; ++i) { + if (num % i === 0) { + s += i; + if (i * i !== num) { + s += num / i; + } + } + } + return s === num; +} +``` + diff --git a/solution/0500-0599/0507.Perfect Number/README_EN.md b/solution/0500-0599/0507.Perfect Number/README_EN.md index faedef371c6a7..2c5b23a5d26ce 100644 --- a/solution/0500-0599/0507.Perfect Number/README_EN.md +++ b/solution/0500-0599/0507.Perfect Number/README_EN.md @@ -50,7 +50,15 @@ tags: -### Solution 1 +### Solution 1: Enumeration + +First, we check if $\textit{num}$ is 1. If it is, then $\textit{num}$ is not a perfect number, and we return $\text{false}$. + +Next, we enumerate all positive divisors of $\textit{num}$ starting from 2. If $\textit{num}$ is divisible by a positive divisor $i$, we add $i$ to the sum $\textit{s}$. If the quotient of $\textit{num}$ divided by $i$ is not equal to $i$, we also add the quotient to the sum $\textit{s}$. + +Finally, we check if $\textit{s}$ is equal to $\textit{num}$. + +The time complexity is $O(\sqrt{n})$, where $n$ is the value of $\textit{num}$. The space complexity is $O(1)$. @@ -62,7 +70,7 @@ class Solution: if num == 1: return False s, i = 1, 2 - while i * i <= num: + while i <= num // i: if num % i == 0: s += i if i != num // i: @@ -75,13 +83,12 @@ class Solution: ```java class Solution { - public boolean checkPerfectNumber(int num) { if (num == 1) { return false; } int s = 1; - for (int i = 2; i * i <= num; ++i) { + for (int i = 2; i <= num / i; ++i) { if (num % i == 0) { s += i; if (i != num / i) { @@ -100,12 +107,16 @@ class Solution { class Solution { public: bool checkPerfectNumber(int num) { - if (num == 1) return false; + if (num == 1) { + return false; + } int s = 1; - for (int i = 2; i * i <= num; ++i) { + for (int i = 2; i <= num / i; ++i) { if (num % i == 0) { s += i; - if (i != num / i) s += num / i; + if (i != num / i) { + s += num / i; + } } } return s == num; @@ -121,11 +132,11 @@ func checkPerfectNumber(num int) bool { return false } s := 1 - for i := 2; i*i <= num; i++ { + for i := 2; i <= num/i; i++ { if num%i == 0 { s += i - if i != num/i { - s += num / i + if j := num / i; i != j { + s += j } } } @@ -133,6 +144,26 @@ func checkPerfectNumber(num int) bool { } ``` +#### TypeScript + +```ts +function checkPerfectNumber(num: number): boolean { + if (num <= 1) { + return false; + } + let s = 1; + for (let i = 2; i <= num / i; ++i) { + if (num % i === 0) { + s += i; + if (i * i !== num) { + s += num / i; + } + } + } + return s === num; +} +``` + diff --git a/solution/0500-0599/0507.Perfect Number/Solution.cpp b/solution/0500-0599/0507.Perfect Number/Solution.cpp index ed7c5d58c6625..8984a79661bc3 100644 --- a/solution/0500-0599/0507.Perfect Number/Solution.cpp +++ b/solution/0500-0599/0507.Perfect Number/Solution.cpp @@ -1,14 +1,18 @@ class Solution { public: bool checkPerfectNumber(int num) { - if (num == 1) return false; + if (num == 1) { + return false; + } int s = 1; - for (int i = 2; i * i <= num; ++i) { + for (int i = 2; i <= num / i; ++i) { if (num % i == 0) { s += i; - if (i != num / i) s += num / i; + if (i != num / i) { + s += num / i; + } } } return s == num; } -}; \ No newline at end of file +}; diff --git a/solution/0500-0599/0507.Perfect Number/Solution.go b/solution/0500-0599/0507.Perfect Number/Solution.go index b9d7429c7e98e..f47e10f0fdca6 100644 --- a/solution/0500-0599/0507.Perfect Number/Solution.go +++ b/solution/0500-0599/0507.Perfect Number/Solution.go @@ -3,13 +3,13 @@ func checkPerfectNumber(num int) bool { return false } s := 1 - for i := 2; i*i <= num; i++ { + for i := 2; i <= num/i; i++ { if num%i == 0 { s += i - if i != num/i { - s += num / i + if j := num / i; i != j { + s += j } } } return s == num -} \ No newline at end of file +} diff --git a/solution/0500-0599/0507.Perfect Number/Solution.java b/solution/0500-0599/0507.Perfect Number/Solution.java index d559d484dd724..5fab60e53400d 100644 --- a/solution/0500-0599/0507.Perfect Number/Solution.java +++ b/solution/0500-0599/0507.Perfect Number/Solution.java @@ -1,11 +1,10 @@ class Solution { - public boolean checkPerfectNumber(int num) { if (num == 1) { return false; } int s = 1; - for (int i = 2; i * i <= num; ++i) { + for (int i = 2; i <= num / i; ++i) { if (num % i == 0) { s += i; if (i != num / i) { @@ -15,4 +14,4 @@ public boolean checkPerfectNumber(int num) { } return s == num; } -} \ No newline at end of file +} diff --git a/solution/0500-0599/0507.Perfect Number/Solution.py b/solution/0500-0599/0507.Perfect Number/Solution.py index 81d137c9f1aac..f9f5d7cfefe97 100644 --- a/solution/0500-0599/0507.Perfect Number/Solution.py +++ b/solution/0500-0599/0507.Perfect Number/Solution.py @@ -3,7 +3,7 @@ def checkPerfectNumber(self, num: int) -> bool: if num == 1: return False s, i = 1, 2 - while i * i <= num: + while i <= num // i: if num % i == 0: s += i if i != num // i: diff --git a/solution/0500-0599/0507.Perfect Number/Solution.ts b/solution/0500-0599/0507.Perfect Number/Solution.ts new file mode 100644 index 0000000000000..824f46efdc9f1 --- /dev/null +++ b/solution/0500-0599/0507.Perfect Number/Solution.ts @@ -0,0 +1,15 @@ +function checkPerfectNumber(num: number): boolean { + if (num <= 1) { + return false; + } + let s = 1; + for (let i = 2; i <= num / i; ++i) { + if (num % i === 0) { + s += i; + if (i * i !== num) { + s += num / i; + } + } + } + return s === num; +}