Skip to content

Commit 8cbbd41

Browse files
authored
feat: add solutions to lc problems: No.0506,0507 (#3823)
1 parent dc28c6d commit 8cbbd41

File tree

12 files changed

+215
-65
lines changed

12 files changed

+215
-65
lines changed

solution/0500-0599/0506.Relative Ranks/README.md

+38-11
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,13 @@ tags:
6565

6666
<!-- solution:start -->
6767

68-
### 方法一
68+
### 方法一:排序
69+
70+
我们使用一个数组 $\textit{idx}$ 存储 $0$ 到 $n-1$ 的下标,然后对 $\textit{idx}$ 进行排序,排序规则为:按照 $\textit{score}$ 的值从大到小排序。
71+
72+
然后我们定义一个数组 $\textit{top3} = [\text{Gold Medal}, \text{Silver Medal}, \text{Bronze Medal}]$,遍历 $\textit{idx}$,对于每个下标 $j$,如果 $j$ 小于 $3$,则 $\textit{ans}[j]$ 为 $\textit{top3}[j]$,否则为 $j+1$。
73+
74+
时间复杂度 $O(n \times \log n)$,空间复杂度 $O(n)$。其中 $n$ 为数组 $\textit{score}$ 的长度。
6975

7076
<!-- tabs:start -->
7177

@@ -77,10 +83,10 @@ class Solution:
7783
n = len(score)
7884
idx = list(range(n))
7985
idx.sort(key=lambda x: -score[x])
80-
top3 = ['Gold Medal', 'Silver Medal', 'Bronze Medal']
86+
top3 = ["Gold Medal", "Silver Medal", "Bronze Medal"]
8187
ans = [None] * n
82-
for i in range(n):
83-
ans[idx[i]] = top3[i] if i < 3 else str(i + 1)
88+
for i, j in enumerate(idx):
89+
ans[j] = top3[i] if i < 3 else str(i + 1)
8490
return ans
8591
```
8692

@@ -112,15 +118,16 @@ class Solution {
112118
public:
113119
vector<string> findRelativeRanks(vector<int>& score) {
114120
int n = score.size();
115-
vector<pair<int, int>> idx;
116-
for (int i = 0; i < n; ++i)
117-
idx.push_back(make_pair(score[i], i));
118-
sort(idx.begin(), idx.end(),
119-
[&](const pair<int, int>& x, const pair<int, int>& y) { return x.first > y.first; });
121+
vector<int> idx(n);
122+
iota(idx.begin(), idx.end(), 0);
123+
sort(idx.begin(), idx.end(), [&score](int a, int b) {
124+
return score[a] > score[b];
125+
});
120126
vector<string> ans(n);
121127
vector<string> top3 = {"Gold Medal", "Silver Medal", "Bronze Medal"};
122-
for (int i = 0; i < n; ++i)
123-
ans[idx[i].second] = i < 3 ? top3[i] : to_string(i + 1);
128+
for (int i = 0; i < n; ++i) {
129+
ans[idx[i]] = i < 3 ? top3[i] : to_string(i + 1);
130+
}
124131
return ans;
125132
}
126133
};
@@ -151,6 +158,26 @@ func findRelativeRanks(score []int) []string {
151158
}
152159
```
153160

161+
#### TypeScript
162+
163+
```ts
164+
function findRelativeRanks(score: number[]): string[] {
165+
const n = score.length;
166+
const idx = Array.from({ length: n }, (_, i) => i);
167+
idx.sort((a, b) => score[b] - score[a]);
168+
const top3 = ['Gold Medal', 'Silver Medal', 'Bronze Medal'];
169+
const ans: string[] = Array(n);
170+
for (let i = 0; i < n; i++) {
171+
if (i < 3) {
172+
ans[idx[i]] = top3[i];
173+
} else {
174+
ans[idx[i]] = (i + 1).toString();
175+
}
176+
}
177+
return ans;
178+
}
179+
```
180+
154181
<!-- tabs:end -->
155182

156183
<!-- solution:end -->

solution/0500-0599/0506.Relative Ranks/README_EN.md

+38-11
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,13 @@ tags:
6464

6565
<!-- solution:start -->
6666

67-
### Solution 1
67+
### Solution 1: Sorting
68+
69+
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.
70+
71+
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$.
72+
73+
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}$.
6874

6975
<!-- tabs:start -->
7076

@@ -76,10 +82,10 @@ class Solution:
7682
n = len(score)
7783
idx = list(range(n))
7884
idx.sort(key=lambda x: -score[x])
79-
top3 = ['Gold Medal', 'Silver Medal', 'Bronze Medal']
85+
top3 = ["Gold Medal", "Silver Medal", "Bronze Medal"]
8086
ans = [None] * n
81-
for i in range(n):
82-
ans[idx[i]] = top3[i] if i < 3 else str(i + 1)
87+
for i, j in enumerate(idx):
88+
ans[j] = top3[i] if i < 3 else str(i + 1)
8389
return ans
8490
```
8591

@@ -111,15 +117,16 @@ class Solution {
111117
public:
112118
vector<string> findRelativeRanks(vector<int>& score) {
113119
int n = score.size();
114-
vector<pair<int, int>> idx;
115-
for (int i = 0; i < n; ++i)
116-
idx.push_back(make_pair(score[i], i));
117-
sort(idx.begin(), idx.end(),
118-
[&](const pair<int, int>& x, const pair<int, int>& y) { return x.first > y.first; });
120+
vector<int> idx(n);
121+
iota(idx.begin(), idx.end(), 0);
122+
sort(idx.begin(), idx.end(), [&score](int a, int b) {
123+
return score[a] > score[b];
124+
});
119125
vector<string> ans(n);
120126
vector<string> top3 = {"Gold Medal", "Silver Medal", "Bronze Medal"};
121-
for (int i = 0; i < n; ++i)
122-
ans[idx[i].second] = i < 3 ? top3[i] : to_string(i + 1);
127+
for (int i = 0; i < n; ++i) {
128+
ans[idx[i]] = i < 3 ? top3[i] : to_string(i + 1);
129+
}
123130
return ans;
124131
}
125132
};
@@ -150,6 +157,26 @@ func findRelativeRanks(score []int) []string {
150157
}
151158
```
152159

160+
#### TypeScript
161+
162+
```ts
163+
function findRelativeRanks(score: number[]): string[] {
164+
const n = score.length;
165+
const idx = Array.from({ length: n }, (_, i) => i);
166+
idx.sort((a, b) => score[b] - score[a]);
167+
const top3 = ['Gold Medal', 'Silver Medal', 'Bronze Medal'];
168+
const ans: string[] = Array(n);
169+
for (let i = 0; i < n; i++) {
170+
if (i < 3) {
171+
ans[idx[i]] = top3[i];
172+
} else {
173+
ans[idx[i]] = (i + 1).toString();
174+
}
175+
}
176+
return ans;
177+
}
178+
```
179+
153180
<!-- tabs:end -->
154181

155182
<!-- solution:end -->

solution/0500-0599/0506.Relative Ranks/Solution.cpp

+9-8
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,16 @@ class Solution {
22
public:
33
vector<string> findRelativeRanks(vector<int>& score) {
44
int n = score.size();
5-
vector<pair<int, int>> idx;
6-
for (int i = 0; i < n; ++i)
7-
idx.push_back(make_pair(score[i], i));
8-
sort(idx.begin(), idx.end(),
9-
[&](const pair<int, int>& x, const pair<int, int>& y) { return x.first > y.first; });
5+
vector<int> idx(n);
6+
iota(idx.begin(), idx.end(), 0);
7+
sort(idx.begin(), idx.end(), [&score](int a, int b) {
8+
return score[a] > score[b];
9+
});
1010
vector<string> ans(n);
1111
vector<string> top3 = {"Gold Medal", "Silver Medal", "Bronze Medal"};
12-
for (int i = 0; i < n; ++i)
13-
ans[idx[i].second] = i < 3 ? top3[i] : to_string(i + 1);
12+
for (int i = 0; i < n; ++i) {
13+
ans[idx[i]] = i < 3 ? top3[i] : to_string(i + 1);
14+
}
1415
return ans;
1516
}
16-
};
17+
};

solution/0500-0599/0506.Relative Ranks/Solution.py

+3-3
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@ def findRelativeRanks(self, score: List[int]) -> List[str]:
33
n = len(score)
44
idx = list(range(n))
55
idx.sort(key=lambda x: -score[x])
6-
top3 = ['Gold Medal', 'Silver Medal', 'Bronze Medal']
6+
top3 = ["Gold Medal", "Silver Medal", "Bronze Medal"]
77
ans = [None] * n
8-
for i in range(n):
9-
ans[idx[i]] = top3[i] if i < 3 else str(i + 1)
8+
for i, j in enumerate(idx):
9+
ans[j] = top3[i] if i < 3 else str(i + 1)
1010
return ans
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
function findRelativeRanks(score: number[]): string[] {
2+
const n = score.length;
3+
const idx = Array.from({ length: n }, (_, i) => i);
4+
idx.sort((a, b) => score[b] - score[a]);
5+
const top3 = ['Gold Medal', 'Silver Medal', 'Bronze Medal'];
6+
const ans: string[] = Array(n);
7+
for (let i = 0; i < n; i++) {
8+
if (i < 3) {
9+
ans[idx[i]] = top3[i];
10+
} else {
11+
ans[idx[i]] = (i + 1).toString();
12+
}
13+
}
14+
return ans;
15+
}

solution/0500-0599/0507.Perfect Number/README.md

+41-10
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,15 @@ tags:
5151

5252
<!-- solution:start -->
5353

54-
### 方法一
54+
### 方法一:枚举
55+
56+
我们首先判断 $\textit{num}$ 是否为 1,如果为 1,则 $\textit{num}$ 不是完美数,返回 $\text{false}$。
57+
58+
然后,我们从 2 开始枚举 $\textit{num}$ 的所有正因子,如果 $\textit{num}$ 能被 $\textit{num}$ 的某个正因子 $i$ 整除,那么我们将 $i$ 加入到答案 $\textit{s}$ 中。如果 $\textit{num}$ 除以 $i$ 得到的商不等于 $i$,我们也将 $\textit{num}$ 除以 $i$ 得到的商加入到答案 $\textit{s}$ 中。
59+
60+
最后,我们判断 $\textit{s}$ 是否等于 $\textit{num}$ 即可。
61+
62+
时间复杂度 $O(\sqrt{n})$,其中 $n$ 为 $\textit{num}$ 的大小。空间复杂度 $O(1)$。
5563

5664
<!-- tabs:start -->
5765

@@ -63,7 +71,7 @@ class Solution:
6371
if num == 1:
6472
return False
6573
s, i = 1, 2
66-
while i * i <= num:
74+
while i <= num // i:
6775
if num % i == 0:
6876
s += i
6977
if i != num // i:
@@ -76,13 +84,12 @@ class Solution:
7684

7785
```java
7886
class Solution {
79-
8087
public boolean checkPerfectNumber(int num) {
8188
if (num == 1) {
8289
return false;
8390
}
8491
int s = 1;
85-
for (int i = 2; i * i <= num; ++i) {
92+
for (int i = 2; i <= num / i; ++i) {
8693
if (num % i == 0) {
8794
s += i;
8895
if (i != num / i) {
@@ -101,12 +108,16 @@ class Solution {
101108
class Solution {
102109
public:
103110
bool checkPerfectNumber(int num) {
104-
if (num == 1) return false;
111+
if (num == 1) {
112+
return false;
113+
}
105114
int s = 1;
106-
for (int i = 2; i * i <= num; ++i) {
115+
for (int i = 2; i <= num / i; ++i) {
107116
if (num % i == 0) {
108117
s += i;
109-
if (i != num / i) s += num / i;
118+
if (i != num / i) {
119+
s += num / i;
120+
}
110121
}
111122
}
112123
return s == num;
@@ -122,18 +133,38 @@ func checkPerfectNumber(num int) bool {
122133
return false
123134
}
124135
s := 1
125-
for i := 2; i*i <= num; i++ {
136+
for i := 2; i <= num/i; i++ {
126137
if num%i == 0 {
127138
s += i
128-
if i != num/i {
129-
s += num / i
139+
if j := num / i; i != j {
140+
s += j
130141
}
131142
}
132143
}
133144
return s == num
134145
}
135146
```
136147

148+
#### TypeScript
149+
150+
```ts
151+
function checkPerfectNumber(num: number): boolean {
152+
if (num <= 1) {
153+
return false;
154+
}
155+
let s = 1;
156+
for (let i = 2; i <= num / i; ++i) {
157+
if (num % i === 0) {
158+
s += i;
159+
if (i * i !== num) {
160+
s += num / i;
161+
}
162+
}
163+
}
164+
return s === num;
165+
}
166+
```
167+
137168
<!-- tabs:end -->
138169

139170
<!-- solution:end -->

0 commit comments

Comments
 (0)