小工具知识网

当前位置: 首页 > 行业知识 > 图论-算法题

行业知识

图论-算法题

2026-10-31 16:21:57 来源:互联网转载

797. 所有可能的路径

题目:

���你一个有 n 个节点的 有向无环图(DAG),请你找出所有从节点 0 到节点 n-1 的路径并输出(不要求按特定顺序)

graph[i] 是一个从节点 i 可以访问的所有节点的列表(即从节点 i 到节点 graph[i][j]存在一条有向边)。

示例 1:

输入:graph = [[1,2],[3],[3],[]]输出:[[0,1,3],[0,2,3]]解释:有两条路径 0 -> 1 -> 3 和 0 -> 2 -> 3

示例 2:

输入:graph = [[4,3,1],[3,2,4],[3],[4],[]]输出:[[0,4],[0,3,4],[0,1,3,4],[0,1,2,3,4],[0,1,4]]

答案

class Solution {    List res;    List list;    public List allPathsSourceTarget(int[][] graph) {        res = new ArrayList();        list = new LinkedList();        list.add(0);        deal(graph,0);        return res;    }    //回溯:深度优先遍历    void deal(int[][] graph,int node){        if(node==graph.length-1){            res.add(new ArrayList(list));        }        for(int num : graph[node]){            list.add(num);            deal(graph,num);            list.removeLast();        }    }}

200. 岛屿数量

题目

给你一个由 '1'(陆地)和 '0'(水)组成的的二维网格,请你计算网格中岛屿的数量。

岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。

此外,你可以假设该网格的四条边均被水包围。

示例 1:

输入:grid = [  ["1","1","1","1","0"],  ["1","1","0","1","0"],  ["1","1","0","0","0"],  ["0","0","0","0","0"]]输出:1

示例 2:

输入:grid = [  ["1","1","0","0","0"],  ["1","1","0","0","0"],  ["0","0","1","0","0"],  ["0","0","0","1","1"]]输出:3

答案

class Solution {    int[][] dirs = {{1,0},{-1,0},{0,1},{0,-1}};    int m,n;    public int numIslands(char[][] grid) {        m = grid.length;        n = grid[0].length;        int res = 0;        for(int i=0;i            for(int j=0;j                if(grid[i][j]=='1'){                    res++;                    deal(grid,i,j);//将遍历过的陆地—水                }            }        }        return res;    }    void deal(char[][] grid,int i,int j){        if(i            return;        }        grid[i][j] = '0';        for(int[] dir : dirs){            deal(grid,i+dir[0],j+dir[1]);        }    }}    int[][] dirs = {{1,0},{-1,0},{0,1},{0,-1}};    int m,n;    int count;    public int maxAreaOfIsland(int[][] grid) {        m = grid.length;        n = grid[0].length;        int res = 0;        for(int i=0;i            for(int j=0;j                if(grid[i][j]==1){                    count = 0;                    deal(grid,i,j);                    res = Math.max(res,count);                }            }        }        return res;    }    void deal(int[][] grid,int i,int j){        if(i            return;        }        grid[i][j] = 0;        count++;        for(int[] dir : dirs){            deal(grid,i+dir[0],j+dir[1]);        }    }}    int[][] dirs = {{1,0},{-1,0},{0,1},{0,-1}};    int m,n;    public int numEnclaves(int[][] grid) {        m = grid.length;        n = grid[0].length;        for(int i=0;i            deal(grid,i,0);            deal(grid,i,n-1);        }        for(int j=0;j            deal(grid,0,j);            deal(grid,m-1,j);        }        int res = 0;        for(int i=1;i            for(int j=1;j                if(grid[i][j]==1){                    res++;                }            }        }        return res;    }    void deal(int[][] grid,int i,int j){        if(i            return;        }        grid[i][j] = 0;        for(int[] dir : dirs){            deal(grid,i+dir[0],j+dir[1]);        }    }}    int[][] dirs = {{1,0},{-1,0},{0,1},{0,-1}};    int m,n;    public void solve(char[][] board) {        m = board.length;        n = board[0].length;        for(int i=0;i            deal(board,i,0);            deal(board,i,n-1);        }        for(int j=0;j            deal(board,0,j);            deal(board,m-1,j);        }        for(int i=0;i            for(int j=0;j                if(board[i][j]=='A'){                    board[i][j] = 'O';                }else if(board[i][j]=='O'){                    board[i][j] ='X';                }            }        }    }    void deal(char[][] board,int i,int j){        if(i            return;        }        board[i][j] = 'A';        for(int[] dir : dirs){            deal(board,i+dir[0],j+dir[1]);        }    }}    public boolean canVisitAllRooms(List        boolean[] visited = new boolean[rooms.size()];        Queue            int curr = queue.poll();            for(int index : rooms.get(curr)){                if(!visited[index]){                    visited[index] = true;                    queue.offer(index);                }            }        }        for(boolean flag : visited){            if(!flag){                return false;            }        }        return true;    }}    int[][] dirs = {{1,0},{-1,0},{0,1},{0,-1}};    int m,n;    public int islandPerimeter(int[][] grid) {        m = grid.length;        n = grid[0].length;        int res = 0;        for(int i=0;i            for(int j=0;j                if(grid[i][j]==1){                    for(int[] dir : dirs){                        int p = i + dir[0];                        int q = j + dir[1];                        if(p                            res++;                        }                    }                }            }        }        return res;    }}

上一篇:怎么买紫鸟服务器?

下一篇:【C++】string类的使用④(字符串操作String operations || 常量成员Member constants)