Skip to content

Commit a466920

Browse files
committed
feat: add solutions to lc problem: No.0851
No.0851.Loud and Rich
1 parent be62e49 commit a466920

File tree

9 files changed

+249
-143
lines changed

9 files changed

+249
-143
lines changed

solution/0800-0899/0844.Backspace String Compare/README.md

+7-1
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,13 @@
5858

5959
**方法一:双指针**
6060

61-
时间复杂度 O(len(s) + len(t)),空间复杂度 O(1)。
61+
我们用双指针 $i$ 和 $j$ 分别指向字符串 $s$ 和 $t$ 的末尾。
62+
63+
每次向前移动一个字符,如果当前字符是退格符,则跳过当前字符,同时退格符的数量加一,如果当前字符不是退格符,则判断退格符的数量,如果退格符的数量大于 $0$,则跳过当前字符,同时退格符的数量减一,如果退格符的数量等于 $0$,那么该字符需要进行比较。
64+
65+
我们每次找到两个字符串中需要比较的字符,然后进行比较,如果两个字符不相等,则返回 $false$,如果遍历完两个字符串,都没有发现不相等的字符,则返回 $true$。
66+
67+
时间复杂度 $O(m + n)$,空间复杂度 $O(1)$。其中 $m$ 和 $n$ 分别是字符串 $s$ 和 $t$ 的长度。
6268

6369
<!-- tabs:start -->
6470

solution/0800-0899/0847.Shortest Path Visiting All Nodes/README.md

+2
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,8 @@
5151

5252
<!-- 这里可写通用的实现逻辑 -->
5353

54+
**方法一:BFS(A\* 算法)**
55+
5456
因为每条边权值一样,所以用 BFS 就能得出最短路径,过程中可以用**状态压缩**记录节点的访问情况。另外,同一个节点 u 以及对应的节点访问情况需要保证只被搜索过一次,因此可以用 `vis(u, state)` 表示是否已经被搜索过,防止无效的重复搜索。
5557

5658
本题也属于 BFS 最小步数模型,可以使用 A\* 算法优化搜索。

solution/0800-0899/0851.Loud and Rich/README.md

+84-47
Original file line numberDiff line numberDiff line change
@@ -57,9 +57,13 @@ answer[7] = 7,
5757

5858
<!-- 这里可写通用的实现逻辑 -->
5959

60-
根据 richer 关系构建有向图,如果 a 比 b 有钱,那么连一条从 b 到 a 的有向边,最终构建出一个有向无环图。
60+
**方法一:DFS**
6161

62-
我们知道,从图的任一点 i 出发,沿着有向边所能访问到的点,都比 i 更有钱。DFS 深搜即可。
62+
我们先用邻接表 $g$ 存储 $richer$ 数组中的信息,其中 $g[i]$ 表示所有比 $i$ 更有钱的人的集合。
63+
64+
然后对于每个人 $i$,我们用 DFS 遍历所有比 $i$ 更有钱的人,找到其中安静值最小的人,即为答案。
65+
66+
时间复杂度 $O(m + n)$,空间复杂度 $O(m + n)$。其中 $m$ 和 $n$ 分别为 $richer$ 数组和 $quiet$ 数组的长度。
6367

6468
<!-- tabs:start -->
6569

@@ -70,13 +74,7 @@ answer[7] = 7,
7074
```python
7175
class Solution:
7276
def loudAndRich(self, richer: List[List[int]], quiet: List[int]) -> List[int]:
73-
n = len(quiet)
74-
g = defaultdict(list)
75-
for a, b in richer:
76-
g[b].append(a)
77-
ans = [-1] * n
78-
79-
def dfs(i):
77+
def dfs(i: int):
8078
if ans[i] != -1:
8179
return
8280
ans[i] = i
@@ -85,6 +83,11 @@ class Solution:
8583
if quiet[ans[j]] < quiet[ans[i]]:
8684
ans[i] = ans[j]
8785

86+
g = defaultdict(list)
87+
for a, b in richer:
88+
g[b].append(a)
89+
n = len(quiet)
90+
ans = [-1] * n
8891
for i in range(n):
8992
dfs(i)
9093
return ans
@@ -96,19 +99,22 @@ class Solution:
9699

97100
```java
98101
class Solution {
99-
private Map<Integer, List<Integer>> g;
102+
private List<Integer>[] g;
103+
private int n;
100104
private int[] quiet;
101105
private int[] ans;
102106

103107
public int[] loudAndRich(int[][] richer, int[] quiet) {
104-
g = new HashMap<>();
108+
n = quiet.length;
105109
this.quiet = quiet;
106-
ans = new int[quiet.length];
110+
g = new List[n];
111+
ans = new int[n];
107112
Arrays.fill(ans, -1);
108-
for (int[] r : richer) {
109-
g.computeIfAbsent(r[1], k -> new ArrayList<>()).add(r[0]);
113+
Arrays.setAll(g, k -> new ArrayList<>());
114+
for (var r : richer) {
115+
g[r[1]].add(r[0]);
110116
}
111-
for (int i = 0; i < quiet.length; ++i) {
117+
for (int i = 0; i < n; ++i) {
112118
dfs(i);
113119
}
114120
return ans;
@@ -119,10 +125,7 @@ class Solution {
119125
return;
120126
}
121127
ans[i] = i;
122-
if (!g.containsKey(i)) {
123-
return;
124-
}
125-
for (int j : g.get(i)) {
128+
for (int j : g[i]) {
126129
dfs(j);
127130
if (quiet[ans[j]] < quiet[ans[i]]) {
128131
ans[i] = ans[j];
@@ -140,18 +143,25 @@ public:
140143
vector<int> loudAndRich(vector<vector<int>>& richer, vector<int>& quiet) {
141144
int n = quiet.size();
142145
vector<vector<int>> g(n);
143-
for (auto& r : richer) g[r[1]].push_back(r[0]);
146+
for (auto& r : richer) {
147+
g[r[1]].push_back(r[0]);
148+
}
144149
vector<int> ans(n, -1);
145150
function<void(int)> dfs = [&](int i) {
146-
if (ans[i] != -1) return;
151+
if (ans[i] != -1) {
152+
return;
153+
}
147154
ans[i] = i;
148155
for (int j : g[i]) {
149156
dfs(j);
150-
if (quiet[ans[j]] < quiet[ans[i]]) ans[i] = ans[j];
157+
if (quiet[ans[j]] < quiet[ans[i]]) {
158+
ans[i] = ans[j];
159+
}
151160
}
152161
};
153-
for (int i = 0; i < n; ++i)
162+
for (int i = 0; i < n; ++i) {
154163
dfs(i);
164+
}
155165
return ans;
156166
}
157167
};
@@ -161,35 +171,62 @@ public:
161171
162172
```go
163173
func loudAndRich(richer [][]int, quiet []int) []int {
164-
n := len(quiet)
165-
ans := make([]int, n)
166-
g := make([][]int, n)
167-
for i := 0; i < n; i++ {
168-
ans[i] = -1
169-
g[i] = make([]int, 0)
170-
}
171-
for _, r := range richer {
172-
g[r[1]] = append(g[r[1]], r[0])
173-
}
174+
n := len(quiet)
175+
g := make([][]int, n)
176+
ans := make([]int, n)
177+
for i := range g {
178+
ans[i] = -1
179+
}
180+
for _, r := range richer {
181+
a, b := r[0], r[1]
182+
g[b] = append(g[b], a)
183+
}
184+
var dfs func(int)
185+
dfs = func(i int) {
186+
if ans[i] != -1 {
187+
return
188+
}
189+
ans[i] = i
190+
for _, j := range g[i] {
191+
dfs(j)
192+
if quiet[ans[j]] < quiet[ans[i]] {
193+
ans[i] = ans[j]
194+
}
195+
}
196+
}
197+
for i := range ans {
198+
dfs(i)
199+
}
200+
return ans
201+
}
202+
```
174203

175-
var dfs func(i int)
176-
dfs = func(i int) {
177-
if ans[i] != - 1 {
178-
return
204+
### **TypeScript**
205+
206+
```ts
207+
function loudAndRich(richer: number[][], quiet: number[]): number[] {
208+
const n = quiet.length;
209+
const g: number[][] = new Array(n).fill(0).map(() => []);
210+
for (const [a, b] of richer) {
211+
g[b].push(a);
212+
}
213+
const ans: number[] = new Array(n).fill(-1);
214+
const dfs = (i: number) => {
215+
if (ans[i] != -1) {
216+
return ans;
179217
}
180-
ans[i] = i
181-
for _, j := range g[i] {
182-
dfs(j)
183-
if quiet[ans[j]] < quiet[ans[i]] {
184-
ans[i] = ans[j]
218+
ans[i] = i;
219+
for (const j of g[i]) {
220+
dfs(j);
221+
if (quiet[ans[j]] < quiet[ans[i]]) {
222+
ans[i] = ans[j];
185223
}
186224
}
225+
};
226+
for (let i = 0; i < n; ++i) {
227+
dfs(i);
187228
}
188-
189-
for i := 0; i < n; i++ {
190-
dfs(i)
191-
}
192-
return ans
229+
return ans;
193230
}
194231
```
195232

0 commit comments

Comments
 (0)