算法面试通关 40 讲
覃超
Sophon Tech 创始人,前 Facebook 工程师,卡内基梅隆大学计算机硕士
78356 人已学习
新⼈⾸单¥68
课程目录
已完结/共 62 讲
第二章:理论讲解+面试题实战 (53讲)
算法面试通关 40 讲
登录|注册
留言
8
收藏
沉浸
阅读
分享
手机端
回顶部
当前播放: 53 | 面试题:岛屿的个数&朋友圈(上)
00:00 / 00:00
高清
  • 高清
1.0x
  • 2.0x
  • 1.5x
  • 1.25x
  • 1.0x
  • 0.75x
  • 0.5x
网页全屏
全屏
00:00
付费课程,可试看
01 | 合格程序员的第一步:算法与数据结构
02 | 如何事半功倍地学习算法与数据结构
03 | 如何计算算法的复杂度
04 | 如何通过LeetCode来进行算法题目练习
05 | 理论讲解:数组&链表
06 | 面试题:反转一个单链表&判断链表是否有环
07 | 理论讲解:堆栈&队列
08 | 面试题:判断括号字符串是否有效
09 | 面试题:用队列实现栈&用栈实现队列
10 | 理论讲解:优先队列
11 | 面试题:返回数据流中的第K大元素
12 | 面试题:返回滑动窗口中的最大值
13 | 理论讲解:哈希表
14 | 面试题:有效的字母异位词
15 | 面试题:两数之和
16 | 面试题:三数之和
17 | 理论讲解:树&二叉树&二叉搜索树
18 | 面试题:验证二叉搜索树
19 | 面试题:二叉树&二叉搜索树的最近公共祖先
20 | 理论讲解:二叉树遍历
21 | 理论讲解:递归&分治
22 | 面试题:Pow(x,n)
23 | 面试题:求众数
24 | 理论讲解:贪心算法
25 | 面试题:买卖股票的最佳时机
26 | 理论讲解:广度优先搜索
27 | 理论讲解:深度优先搜索
28 | 面试题:二叉树层次遍历
29 | 面试题:二叉树的最大和最小深度
30 | 面试题:生成有效括号组合
31 | 理论讲解:剪枝
32 | 面试题:N皇后问题
33 | 面试题:数独问题
34 | 理论讲解:二分查找
35 | 面试题:实现一个求解平方根的函数
36 | 理论讲解:字典树
37 | 面试题:实现一个字典树
38 | 面试题:二维网格中的单词搜索问题
39 | 理论讲解:位运算
40 | 面试题:统计位1的个数
41 | 面试题:2的幂次方问题&比特位计数问题
42 | 面试题:N皇后问题的另一种解法
43 | 理论理解:动态规划(上)
44 | 理论理解:动态规划(下)
45 | 面试题:爬楼梯
46 | 面试题:三角形的最小路径和
47 | 面试题:乘积最大子序列
48 | 面试题:股票买卖系列
49 | 面试题:最长上升子序列
50 | 面试题:零钱兑换
51 | 面试题:编辑距离
52 | 理论讲解:并查集
53 | 面试题:岛屿的个数&朋友圈(上)
54 | 面试题:岛屿的个数&朋友圈(下)
55 | 理论讲解: LRU Cache
56 | 面试题:设计和实现一个LRU Cache缓存机制
57 | 理论讲解:布隆过滤器
58 | 课程重点回顾
59 | FAQ答疑&面试中切题四件套
60 | 回到起点:斐波拉契数列
61 | 白板实战番外篇:斐波拉契数列
62 | 结课测试&最后的一些经验分享
登录 后留言

全部留言(8)

  • 最新
  • 精选
朋友圈问题不能转化成求岛屿个数问题,比如三个人的朋友圈,AC互相认识,B只认识自己,输入如下所示: [[1, 0, 1], [0, 1, 0], [1, 0, 1]] 这要统计岛屿岂不是有5个?!
2019-06-28
3
7
czh
如果问题能够抽象为两两关系,那么可以尝试使用并查集解决 抽象为并查集解决的步骤: 1.并查集初始化 2.元素合并union(建立两两之间的一对一联系) 3.查找find
2019-09-28
2
mickey
class Solution { int[] dx = { -1, 1, 0, 0 }; int[] dy = { 0, 0, -1, 1 }; int maxX = 0; int maxY = 0; Set<String> visited = new HashSet<String>(); char[][] grid; public int numIslands(char[][] grid) { this.grid = grid; if (grid == null || grid.length <= 0) return 0; maxX = grid.length; maxY = grid[0].length; int sum = 0; for (int i = 0; i < grid.length; i++) { for (int j = 0; j < grid[i].length; j++) { sum += floodFillDFS(i, j); } } return sum; } // 暴_力_破_解 private int floodFillDFS(int i, int j) { if (!isValid(i, j)) { return 0; } System.out.println("v [" + i + "][" + j + "]"); visited.add(i + "," + j); // 设置被访问 for (int n = 0; n < 4; n++) { floodFillDFS(i + dx[n], j + dy[n]); } return 1; } // 判断是否合法的坐标 private boolean isValid(int i, int j) { if (i < 0 || i >= maxX || j < 0 || j >= maxY) return false; if (grid[i][j] == '0' || visited.contains(i + "," + j)) return false; return true; } }
2020-03-17
1
Hc_Zzz
朋友圈那題如果有union-find做的話: ``` class Solution: def findCircleNum(self, M: List[List[int]]) -> int: if not M: return row, col = len(M), len(M[0]) self.count = len(M) friends = [i for i in range(row)] # find def find(x): if friends[x] != x: return find(friends[x]) return friends[x] # unio def union(x, y): xroot, yroot = find(x), find(y) if xroot == yroot: return friends[xroot] = yroot self.count -= 1 for i in range(row): for j in range(col): # handle only half the chart if i < j and M[i][j] == 1: union(i, j) return self.count ```
2019-08-05
1
Geek1591
BFS 总是提示 TLE var numIslands = function(grid) { const dx = [-1, 1, 0, 0] const dy = [0, 0, -1, 1] const m = grid.length, n = grid[0].length const visited = new Set() let count = 0 for (let i = 0; i < m; i++) { for (let j = 0; j < n; j++) { count += bloodFill_BFS(i, j) } } return count function bloodFill_BFS (i, j) { if (!isValid(i, j)) return 0 visited.add(`${i}-${j}`) let queue =[[i, j]] while (queue.length) { let [x, y] = queue.shift() for (let k = 0; k < 4; k++) { let new_x = x + dx[k], new_y = y + dy[k] if (isValid(new_x, new_y)) { visited.add(new_x, new_y) queue.push([new_x, new_y]) } } } return 1 } function isValid (i, j) { if (i < 0 || i >= m || j < 0 || j >= n) return false if (grid[i][j] === "0" || visited.has(`${i}-${j}`)) return false return true } }
2021-03-25
Geek_2179fb
求问超哥,第200题,要求必须两个相邻的陆地才能组成岛屿,那么单个1就不能算作岛屿了吧
2020-04-16
戈吉
BFS就可以了
2020-02-23
Sun0010
func numIslands(_ g: [[Character]]) -> Int { var grid = g var count = 0 if grid.count == 0 { return 0 } let Rows = grid.count let Cols = grid.first?.count ?? 0 for i in 0..<Rows { for j in 0..<Cols { if grid[i][j] == "1" { count += 1 renderOneToZero(&grid,Rows: Rows,Cols: Cols,i: i,j: j) } } } return count } func renderOneToZero(_ grid: inout [[Character]], Rows:Int,Cols:Int, i:Int, j:Int) { if i >= Rows || j >= Cols || i < 0 || j < 0 { return } if grid[i][j] == "1" { grid[i][j] = "0" //把 上 左 下 右 //左 renderOneToZero(&grid, Rows: Rows, Cols: Cols, i: i, j: j-1) //右 renderOneToZero(&grid, Rows: Rows, Cols: Cols, i: i , j: j + 1) //上 renderOneToZero(&grid, Rows: Rows, Cols: Cols, i: i - 1 , j: j) //下面 renderOneToZero(&grid, Rows: Rows, Cols: Cols, i: i + 1 , j: j) } }
2019-10-23
收起评论