Skip to content

Commit 35ea005

Browse files
committed
feat: add solutions to lc problem: No.1786
No.1786.Number of Restricted Paths From First to Last Node
1 parent 153f827 commit 35ea005

File tree

7 files changed

+161
-2
lines changed

7 files changed

+161
-2
lines changed

solution/1700-1799/1785.Minimum Elements to Add to Form a Given Sum/README.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@
4646

4747
**方法一:贪心**
4848

49-
先计算数组元素总和 $s$,然后计算 $s$ 与 $goal$ 的差值 $d$。
49+
我们先计算数组元素总和 $s$,然后计算 $s$ 与 $goal$ 的差值 $d$。
5050

5151
那么需要添加的元素数量为 $d$ 的绝对值除以 $limit$ 向上取整,即 $\lceil \frac{|d|}{limit} \rceil$。
5252

@@ -74,6 +74,7 @@ class Solution:
7474
```java
7575
class Solution {
7676
public int minElements(int[] nums, int limit, int goal) {
77+
// long s = Arrays.stream(nums).asLongStream().sum();
7778
long s = 0;
7879
for (int v : nums) {
7980
s += v;

solution/1700-1799/1785.Minimum Elements to Add to Form a Given Sum/README_EN.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ class Solution:
5454
```java
5555
class Solution {
5656
public int minElements(int[] nums, int limit, int goal) {
57+
// long s = Arrays.stream(nums).asLongStream().sum();
5758
long s = 0;
5859
for (int v : nums) {
5960
s += v;

solution/1700-1799/1785.Minimum Elements to Add to Form a Given Sum/Solution.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
class Solution {
22
public int minElements(int[] nums, int limit, int goal) {
3+
// long s = Arrays.stream(nums).asLongStream().sum();
34
long s = 0;
45
for (int v : nums) {
56
s += v;

solution/1700-1799/1786.Number of Restricted Paths From First to Last Node/README.md

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,34 @@ class Solution:
9191
return dfs(1)
9292
```
9393

94+
```python
95+
class Solution:
96+
def countRestrictedPaths(self, n: int, edges: List[List[int]]) -> int:
97+
g = defaultdict(list)
98+
for u, v, w in edges:
99+
g[u].append((v, w))
100+
g[v].append((u, w))
101+
dist = [inf] * (n + 1)
102+
dist[n] = 0
103+
q = [(0, n)]
104+
mod = 10**9 + 7
105+
while q:
106+
_, u = heappop(q)
107+
for v, w in g[u]:
108+
if dist[v] > dist[u] + w:
109+
dist[v] = dist[u] + w
110+
heappush(q, (dist[v], v))
111+
arr = list(range(1, n + 1))
112+
arr.sort(key=lambda i: dist[i])
113+
f = [0] * (n + 1)
114+
f[n] = 1
115+
for i in arr:
116+
for j, _ in g[i]:
117+
if dist[i] > dist[j]:
118+
f[i] = (f[i] + f[j]) % mod
119+
return f[1]
120+
```
121+
94122
### **Java**
95123

96124
<!-- 这里可写当前语言的特殊实现逻辑 -->
@@ -156,6 +184,55 @@ class Solution {
156184
}
157185
```
158186

187+
```java
188+
class Solution {
189+
private static final int INF = Integer.MAX_VALUE;
190+
private static final int MOD = (int) 1e9 + 7;
191+
192+
public int countRestrictedPaths(int n, int[][] edges) {
193+
List<int[]>[] g = new List[n + 1];
194+
Arrays.setAll(g, k -> new ArrayList<>());
195+
for (int[] e : edges) {
196+
int u = e[0], v = e[1], w = e[2];
197+
g[u].add(new int[] {v, w});
198+
g[v].add(new int[] {u, w});
199+
}
200+
PriorityQueue<int[]> q = new PriorityQueue<>((a, b) -> a[0] - b[0]);
201+
q.offer(new int[] {0, n});
202+
int[] dist = new int[n + 1];
203+
Arrays.fill(dist, INF);
204+
dist[n] = 0;
205+
while (!q.isEmpty()) {
206+
int[] p = q.poll();
207+
int u = p[1];
208+
for (int[] ne : g[u]) {
209+
int v = ne[0], w = ne[1];
210+
if (dist[v] > dist[u] + w) {
211+
dist[v] = dist[u] + w;
212+
q.offer(new int[] {dist[v], v});
213+
}
214+
}
215+
}
216+
int[] f = new int[n + 1];
217+
f[n] = 1;
218+
Integer[] arr = new Integer[n];
219+
for (int i = 0; i < n; ++i) {
220+
arr[i] = i + 1;
221+
}
222+
Arrays.sort(arr, (i, j) -> dist[i] - dist[j]);
223+
for (int i : arr) {
224+
for (int[] ne : g[i]) {
225+
int j = ne[0];
226+
if (dist[i] > dist[j]) {
227+
f[i] = (f[i] + f[j]) % MOD;
228+
}
229+
}
230+
}
231+
return f[1];
232+
}
233+
}
234+
```
235+
159236
### **C++**
160237

161238
```cpp

solution/1700-1799/1786.Number of Restricted Paths From First to Last Node/README_EN.md

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,34 @@ class Solution:
8282
return dfs(1)
8383
```
8484

85+
```python
86+
class Solution:
87+
def countRestrictedPaths(self, n: int, edges: List[List[int]]) -> int:
88+
g = defaultdict(list)
89+
for u, v, w in edges:
90+
g[u].append((v, w))
91+
g[v].append((u, w))
92+
dist = [inf] * (n + 1)
93+
dist[n] = 0
94+
q = [(0, n)]
95+
mod = 10**9 + 7
96+
while q:
97+
_, u = heappop(q)
98+
for v, w in g[u]:
99+
if dist[v] > dist[u] + w:
100+
dist[v] = dist[u] + w
101+
heappush(q, (dist[v], v))
102+
arr = list(range(1, n + 1))
103+
arr.sort(key=lambda i: dist[i])
104+
f = [0] * (n + 1)
105+
f[n] = 1
106+
for i in arr:
107+
for j, _ in g[i]:
108+
if dist[i] > dist[j]:
109+
f[i] = (f[i] + f[j]) % mod
110+
return f[1]
111+
```
112+
85113
### **Java**
86114

87115
```java
@@ -145,6 +173,55 @@ class Solution {
145173
}
146174
```
147175

176+
```java
177+
class Solution {
178+
private static final int INF = Integer.MAX_VALUE;
179+
private static final int MOD = (int) 1e9 + 7;
180+
181+
public int countRestrictedPaths(int n, int[][] edges) {
182+
List<int[]>[] g = new List[n + 1];
183+
Arrays.setAll(g, k -> new ArrayList<>());
184+
for (int[] e : edges) {
185+
int u = e[0], v = e[1], w = e[2];
186+
g[u].add(new int[] {v, w});
187+
g[v].add(new int[] {u, w});
188+
}
189+
PriorityQueue<int[]> q = new PriorityQueue<>((a, b) -> a[0] - b[0]);
190+
q.offer(new int[] {0, n});
191+
int[] dist = new int[n + 1];
192+
Arrays.fill(dist, INF);
193+
dist[n] = 0;
194+
while (!q.isEmpty()) {
195+
int[] p = q.poll();
196+
int u = p[1];
197+
for (int[] ne : g[u]) {
198+
int v = ne[0], w = ne[1];
199+
if (dist[v] > dist[u] + w) {
200+
dist[v] = dist[u] + w;
201+
q.offer(new int[] {dist[v], v});
202+
}
203+
}
204+
}
205+
int[] f = new int[n + 1];
206+
f[n] = 1;
207+
Integer[] arr = new Integer[n];
208+
for (int i = 0; i < n; ++i) {
209+
arr[i] = i + 1;
210+
}
211+
Arrays.sort(arr, (i, j) -> dist[i] - dist[j]);
212+
for (int i : arr) {
213+
for (int[] ne : g[i]) {
214+
int j = ne[0];
215+
if (dist[i] > dist[j]) {
216+
f[i] = (f[i] + f[j]) % MOD;
217+
}
218+
}
219+
}
220+
return f[1];
221+
}
222+
}
223+
```
224+
148225
### **C++**
149226

150227
```cpp

solution/1800-1899/1814.Count Nice Pairs in an Array/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@
4747

4848
**方法一:式子变换 + 哈希表**
4949

50-
对于下标对 $(i, j)$,如果满足条件,那么有 $nums[i] + rev(nums[j]) = nums[j] + rev(nums[i])$,即 $nums[i] - rev(nums[i]) = nums[j] - rev(nums[j])$。移项后,有 $nums[i] - nums[j] = rev(nums[j]) - rev(nums[i])$。因此,我们可以将 $nums[i] - rev(nums[i])$ 作为哈希表的键,$nums[i] - nums[j]$ 作为哈希表的值,统计每个键出现的次数,然后计算每个键对应的值的组合数,最后将所有组合数相加即可。
50+
对于下标对 $(i, j)$,如果满足条件,那么有 $nums[i] + rev(nums[j]) = nums[j] + rev(nums[i])$,即 $nums[i] - rev(nums[i]) = nums[j] - rev(nums[j])$。移项后,有 $nums[i] - nums[j] = rev(nums[j]) - rev(nums[i])$。因此,我们可以将 $nums[i] - rev(nums[i])$ 作为哈希表的键,$nums[i] - nums[j]$ 作为哈希表的值,统计每个键出现的次数,然后计算每个键对应的值的组合数,最后将所有组合数相加即可。
5151

5252
时间复杂度 $O(n \times \log M)$,其中 $n$ 和 $M$ 分别是数组 `nums` 的长度和数组 `nums` 中的最大值。空间复杂度 $O(n)$。
5353

solution/2100-2199/2179.Count Good Triplets in an Array/README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,8 @@
4545

4646
<!-- 这里可写通用的实现逻辑 -->
4747

48+
**方法一:树状数组或线段树
49+
4850
对于本题,我们先用 pos 记录每个数在 nums2 中的位置,然后依次对 nums1 中的每个元素进行处理。
4951

5052
考虑**以当前数字作为三元组中间数字**的好三元组的数目。第一个数字需要是之前已经遍历过的,并且在 nums2 中的位置比当前数字更靠前的;第三个数字需要是当前还没有遍历过的,并且在 nums2 中的位置比当前数字更靠后的。

0 commit comments

Comments
 (0)