Skip to content

Commit 9590334

Browse files
committed
2 parents c6d7c78 + 9928779 commit 9590334

File tree

4 files changed

+162
-67
lines changed

4 files changed

+162
-67
lines changed

problems/0028.实现strStr.md

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -425,8 +425,8 @@ public:
425425
if (needle.size() == 0) {
426426
return 0;
427427
}
428-
int next[needle.size()];
429-
getNext(next, needle);
428+
vector<int> next(needle.size());
429+
getNext(&next[0], needle);
430430
int j = -1; // // 因为next数组里记录的起始位置为-1
431431
for (int i = 0; i < haystack.size(); i++) { // 注意i就从0开始
432432
while(j >= 0 && haystack[i] != needle[j + 1]) { // 不匹配
@@ -524,8 +524,8 @@ public:
524524
if (needle.size() == 0) {
525525
return 0;
526526
}
527-
int next[needle.size()];
528-
getNext(next, needle);
527+
vector<int> next(needle.size());
528+
getNext(&next[0], needle);
529529
int j = 0;
530530
for (int i = 0; i < haystack.size(); i++) {
531531
while(j > 0 && haystack[i] != needle[j]) {
@@ -1428,4 +1428,3 @@ public int[] GetNext(string needle)
14281428
<a href="https://programmercarl.com/other/kstar.html" target="_blank">
14291429
<img src="../pics/网站星球宣传海报.jpg" width="1000"/>
14301430
</a>
1431-

problems/0045.跳跃游戏II.md

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -285,6 +285,34 @@ class Solution:
285285

286286
### Go
287287

288+
289+
```go
290+
/**
291+
* @date: 2024 Jan 06
292+
* @time: 13:44
293+
* @author: Chris
294+
**/
295+
// 贪心算法优化版
296+
297+
// 记录步骤规则:每超过上一次可达最大范围,需要跳跃一次,次数+1
298+
// 记录位置:i == lastDistance + 1
299+
func jump(nums []int) int {
300+
// 根据题目规则,初始位置为nums[0]
301+
lastDistance := 0 // 上一次覆盖范围
302+
curDistance := 0 // 当前覆盖范围(可达最大范围)
303+
minStep := 0 // 记录最少跳跃次数
304+
305+
for i := 0; i < len(nums); i++ {
306+
if i == lastDistance+1 { // 在上一次可达范围+1的位置,记录步骤
307+
minStep++ // 跳跃次数+1
308+
lastDistance = curDistance // 记录时才可以更新
309+
}
310+
curDistance = max(nums[i]+i, curDistance) // 更新当前可达的最大范围
311+
}
312+
return minStep
313+
}
314+
```
315+
288316
```go
289317
// 贪心版本一
290318
func jump(nums []int) int {

problems/0200.岛屿数量.深搜版.md

Lines changed: 31 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -389,50 +389,41 @@ function numIslands(grid: string[][]): number {
389389
### Go
390390

391391
```go
392+
393+
var DIRECTIONS = [4][2]int{{-1, 0}, {0, -1}, {1, 0}, {0, 1}}
394+
392395
func numIslands(grid [][]byte) int {
393-
// 用1标记已访问
394-
visited := make([][]int, len(grid))
395-
for i := 0; i < len(visited); i++{
396-
visited[i] = make([]int, len(grid[0]))
397-
}
396+
res := 0
398397

399-
var bfs func(x, y int)
400-
bfs = func(x, y int){
401-
stack := make([][]int, 0)
402-
stack = append(stack, []int{x, y})
403-
moveX := []int{1, -1, 0, 0}
404-
moveY := []int{0, 0, 1, -1}
405-
406-
for len(stack) != 0{
407-
node := stack[len(stack) - 1]
408-
stack = stack[:len(stack) - 1]
409-
410-
for i := 0; i < 4; i++{
411-
dx := moveX[i] + node[0]
412-
dy := moveY[i] + node[1]
413-
if dx < 0 || dx >= len(grid) || dy < 0 || dy >= len(grid[0]) || visited[dx][dy] == 1{
414-
continue
415-
}
416-
visited[dx][dy] = 1
417-
if grid[dx][dy] == '1'{
418-
stack = append(stack, []int{dx,dy})
419-
}
420-
}
421-
}
422-
}
398+
visited := make([][]bool, len(grid))
399+
for i := 0; i < len(grid); i++ {
400+
visited[i] = make([]bool, len(grid[0]))
401+
}
423402

424-
result := 0
425-
for i := 0; i < len(grid); i++{
426-
for j := 0; j < len(grid[0]); j++{
427-
if visited[i][j] == 0 && grid[i][j] == '1'{
428-
bfs(i, j)
429-
visited[i][j] = 1
430-
result++
431-
}
432-
}
433-
}
403+
for i, rows := range grid {
404+
for j, v := range rows {
405+
if v == '1' && !visited[i][j] {
406+
res++
407+
dfs(grid, visited, i, j)
408+
}
409+
}
410+
}
411+
412+
return res
413+
}
414+
415+
func dfs(grid [][]byte, visited [][]bool, i, j int) {
416+
visited[x][y] = true
417+
for _, d := range DIRECTIONS {
418+
x, y := i+d[0], j+d[1]
419+
if x < 0 || x >= len(grid) || y < 0 || y >= len(grid[0]) {
420+
continue
421+
}
422+
if grid[x][y] == '1' && !visited[x][y] {
423+
dfs(grid, visited, x, y)
424+
}
425+
}
434426

435-
return result
436427
}
437428
```
438429

problems/1971.寻找图中是否存在路径.md

Lines changed: 99 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -4,30 +4,28 @@
44
</a>
55
<p align="center"><strong><a href="https://mp.weixin.qq.com/s/tqCxrMEU-ajQumL1i8im9A">参与本项目</a>,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!</strong></p>
66

7-
# 1971. 寻找图中是否存在路径
7+
# 1971. 寻找图中是否存在路径
88

99
[题目链接](https://leetcode.cn/problems/find-if-path-exists-in-graph/)
1010

11-
有一个具有 n个顶点的 双向 图,其中每个顶点标记从 0 到 n - 1(包含 0 和 n - 1)。图中的边用一个二维整数数组 edges 表示,其中 edges[i] = [ui, vi] 表示顶点 ui 和顶点 vi 之间的双向边。 每个顶点对由 最多一条 边连接,并且没有顶点存在与自身相连的边。
11+
有一个具有 n 个顶点的 双向 图,其中每个顶点标记从 0 到 n - 1(包含 0 和 n - 1)。图中的边用一个二维整数数组 edges 表示,其中 edges[i] = [ui, vi] 表示顶点 ui 和顶点 vi 之间的双向边。 每个顶点对由 最多一条 边连接,并且没有顶点存在与自身相连的边。
1212

1313
请你确定是否存在从顶点 start 开始,到顶点 end 结束的 有效路径 。
1414

15-
给你数组 edges 和整数 n、start和end,如果从 start 到 end 存在 有效路径 ,则返回 true,否则返回 false 。
16-
17-
18-
![](https://code-thinking-1253855093.file.myqcloud.com/pics/20220705101442.png)
15+
给你数组 edges 和整数 n、start 和 end,如果从 start 到 end 存在 有效路径 ,则返回 true,否则返回 false 。
1916

17+
![](https://code-thinking-1253855093.file.myqcloud.com/pics/20220705101442.png)
2018

2119
提示:
2220

23-
* 1 <= n <= 2 * 10^5
24-
* 0 <= edges.length <= 2 * 10^5
25-
* edges[i].length == 2
26-
* 0 <= ui, vi <= n - 1
27-
* ui != vi
28-
* 0 <= start, end <= n - 1
29-
* 不存在双向边
30-
* 不存在指向顶点自身的边
21+
- 1 <= n <= 2 \* 10^5
22+
- 0 <= edges.length <= 2 \* 10^5
23+
- edges[i].length == 2
24+
- 0 <= ui, vi <= n - 1
25+
- ui != vi
26+
- 0 <= start, end <= n - 1
27+
- 不存在双向边
28+
- 不存在指向顶点自身的边
3129

3230
## 思路
3331

@@ -70,7 +68,7 @@ void join(int u, int v) {
7068
}
7169
```
7270
73-
以上模板中,只要修改 n 大小就可以,本题n不会超过2 * 10^5。
71+
以上模板中,只要修改 n 大小就可以,本题 n 不会超过 2 \* 10^5。
7472
7573
并查集主要有三个功能。
7674
@@ -80,17 +78,17 @@ void join(int u, int v) {
8078
8179
简单介绍并查集之后,我们再来看一下这道题目。
8280
83-
为什么说这道题目是并查集基础题目,题目中各个点是双向图链接,那么判断 一个顶点到另一个顶点有没有有效路径其实就是看这两个顶点是否在同一个集合里。
81+
为什么说这道题目是并查集基础题目,题目中各个点是双向图链接,那么判断 一个顶点到另一个顶点有没有有效路径其实就是看这两个顶点是否在同一个集合里。
8482
85-
如何算是同一个集合呢,有边连在一起,就算是一个集合。
83+
如何算是同一个集合呢,有边连在一起,就算是一个集合。
8684
87-
此时我们就可以直接套用并查集模板。
85+
此时我们就可以直接套用并查集模板。
8886
89-
使用join(int u, int v)将每条边加入到并查集。
87+
使用 join(int u, int v)将每条边加入到并查集。
9088
91-
最后 isSame(int u, int v) 判断是否是同一个根 就可以了。
89+
最后 isSame(int u, int v) 判断是否是同一个根 就可以了。
9290
93-
C++代码如下:
91+
C++代码如下:
9492
9593
```CPP
9694
class Solution {
@@ -191,7 +189,7 @@ class Solution {
191189

192190
### Python:
193191

194-
PYTHON并查集解法如下
192+
PYTHON 并查集解法如下
195193

196194
```PYTHON
197195
class Solution:
@@ -206,6 +204,85 @@ class Solution:
206204
return find(source) == find(destination)
207205
```
208206

207+
### Javascript:
208+
209+
Javascript 并查集解法如下:
210+
211+
```Javascript
212+
class unionF{
213+
constructor(n){
214+
this.count = n
215+
this.roots = new Array(n).fill(0).map((item,index)=>index)
216+
}
217+
218+
findRoot(x){
219+
if(this.roots[x]!==x){
220+
this.roots[x] = this.findRoot(this.roots[x])
221+
}
222+
return this.roots[x]
223+
}
224+
225+
union(x,y){
226+
const rx = this.findRoot(x)
227+
const ry = this.findRoot(y)
228+
this.roots[rx] = ry
229+
this.count--
230+
}
231+
232+
isConnected(x,y){
233+
return this.findRoot(x)===this.findRoot(y)
234+
}
235+
}
236+
237+
var validPath = function(n, edges, source, destination) {
238+
const UF = new unionF(n)
239+
for(const [s,t] of edges){
240+
UF.union(s,t)
241+
}
242+
return UF.isConnected(source,destination)
243+
};
244+
```
245+
246+
Javascript 双向 bfs 解法如下:
247+
248+
```Javascript
249+
var validPath = function(n, edges, source, destination) {
250+
const graph = new Array(n).fill(0).map(()=>[])
251+
for(const [s,t] of edges){
252+
graph[s].push(t)
253+
graph[t].push(s)
254+
}
255+
256+
const visited = new Array(n).fill(false)
257+
function bfs(start,end,graph){
258+
const startq = [start]
259+
const endq = [end]
260+
while(startq.length&&endq.length){
261+
const slen = startq.length
262+
for(let i = 0;i<slen;i++){
263+
const scur = startq.shift()
264+
if(visited[scur]) continue
265+
if(endq.includes(scur)) return true
266+
visited[scur] = true
267+
const neighbors = graph[scur]
268+
startq.push(...neighbors)
269+
}
270+
271+
const elen = endq.length
272+
for(let i = 0;i<elen;i++){
273+
const ecur = endq.shift()
274+
if(visited[ecur]) continue
275+
if(startq.includes(ecur)) return true
276+
visited[ecur] = true
277+
const neighbors = graph[ecur]
278+
endq.push(...neighbors)
279+
}
280+
}
281+
return false
282+
}
283+
return bfs(source,destination,graph)
284+
};
285+
```
209286

210287
<p align="center">
211288
<a href="https://programmercarl.com/other/kstar.html" target="_blank">

0 commit comments

Comments
 (0)