找回密码
 立即注册
首页 业界区 业界 hot100之图论

hot100之图论

峰埋姚 2025-6-21 00:15:24
岛屿数量(200)
  1. class Solution {
  2.    
  3.     public int numIslands(char[][] grid) {
  4.         int res = 0;
  5.         int m = grid.length;
  6.         int n = grid[0].length;
  7.         for (int i = 0; i < m ; i++){
  8.             for (int j = 0; j < n; j++){
  9.                 if (grid[i][j] == '1'){
  10.                     res+=1;
  11.                     markLand(grid, i, j);
  12.                 }
  13.                
  14.             }
  15.         }
  16.         return res;
  17.     }
  18.     private void markLand(char[][] grid, int i, int j){
  19.         if (i < 0 || i > grid.length-1 || j < 0 || j > grid[0].length-1 || grid[i][j] == '0'){
  20.             return ;
  21.         }
  22.         grid[i][j] = '0';
  23.         markLand(grid, i+1, j);
  24.         markLand(grid, i-1, j);
  25.         markLand(grid, i, j+1);
  26.         markLand(grid, i, j-1);
  27.     }
  28. }
复制代码

  • 分析
简单的四向寻找
腐烂的橘子(994)
  1. class Solution {
  2.     private static final int[][] DIRECTIONS = {{1,0}, {-1,0}, {0,1}, {0,-1}};
  3.     public int orangesRotting(int[][] grid) {
  4.         int res = 0;
  5.         int fresh = 0;
  6.         int m = grid.length;
  7.         int n = grid[0].length;
  8.         Deque<int []> rotArray = new ArrayDeque<>();
  9.         
  10.         for (int i = 0; i < m; i++){
  11.             for (int j = 0; j < n; j++){
  12.                 if (grid[i][j] == 1)  fresh++;
  13.                 else if (grid[i][j] == 2)  rotArray.addFirst(new int[] {i, j});
  14.             }
  15.         }
  16.         while (fresh > 0 && !rotArray.isEmpty()){
  17.             res+=1;
  18.             int len = rotArray.size();
  19.             for (int i = 0; i < len; i++){
  20.                 int[] temp = rotArray.removeLast();
  21.                 for (int[] dir : DIRECTIONS){
  22.                     int row = temp[0] + dir[0];
  23.                     int col = temp[1] + dir[1];
  24.                     if (0 <= row && row < m && 0 <= col && col < n
  25.                                                     && grid[row][col] == 1){
  26.                         fresh--;
  27.                         grid[row][col] = 2;
  28.                         rotArray.addFirst(new int[] {row, col});
  29.                     }
  30.                 }
  31.             }
  32.         }
  33.         return fresh>0 ? -1 : res;
  34.     }
  35. }
复制代码

  • 分析
判断图中是否有环
利用三色标记法 {0, 1, 2} →{未达, 正在使用, 可达}
实现Tire(208)

代码太长了就不放了
  1. class Solution {
  2.     public boolean canFinish(int numCourses, int[][] prerequisites) {
  3.         List<Integer>[] line = new ArrayList[numCourses];
  4.         Arrays.setAll(line, i -> new ArrayList<>());
  5.         for (int[] p : prerequisites){
  6.             line[p[1]].add(p[0]);
  7.         }
  8.         int[] colors = new int[numCourses];
  9.         for (int i = 0; i < numCourses; i++){
  10.             if (colors[i] == 0 && dfs(i, colors, line)) return false;
  11.         }
  12.         
  13.         return true;
  14.     }
  15.     private boolean dfs(int i, int[] colors,  List<Integer>[] line){
  16.         colors[i] = 1;
  17.         for (int j : line[i]){
  18.             if (colors[j] == 1 || colors[j] == 0 && dfs(j, colors, line)){
  19.                 return true;
  20.             }
  21.         }
  22.         colors[i] = 2;
  23.         return false;
  24.     }
  25. }
复制代码

  • 分析
insert() 部分 实际上是开辟道路  if (curr.son[c] == null)   curr.son[c] = new Node();
search() 和 startsWith() 实际上都是一路沿son下移, 遇到没开辟完的路线 return false
如果移动结束了, 如果当前节点的end == true 则为完整单词 , 否则为前缀

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册