准备一个dfs和bfs的模板吧

来源:互联网 发布:中小企业人才流失数据 编辑:程序博客网 时间:2024/05/22 00:42

733. Flood Fill

给定一个二维矩阵、一个坐标值以及一个新的颜色值,判断二维矩阵中给定坐标点的值与新的颜色值是否相等,如果相等返回原二维矩阵,如果不等将与给定坐标点值相连的相同颜色值都改变为新的颜色值。

思路:递归的对给定坐标周围的值进行循环判断。

class Solution {    public int[][] floodFill(int[][] image, int sr, int sc, int newColor) {        int color = image[sr][sc];        if (color != newColor) dfs(image, sr, sc, color, newColor);        return image;    }    public void dfs(int[][] image, int r, int c, int color, int newColor) {        if (image[r][c] == color) {            image[r][c] = newColor;            if (r >= 1) dfs(image, r-1, c, color, newColor);            if (c >= 1) dfs(image, r, c-1, color, newColor);            if (r+1 < image.length) dfs(image, r+1, c, color, newColor);            if (c+1 < image[0].length) dfs(image, r, c+1, color, newColor);        }    }}

[LeetCode] Number of Islands 岛屿的数量

DFS
public int numIslands(char[][] grid) {    int count=0;    for(int i=0;i<grid.length;i++)        for(int j=0;j<grid[0].length;j++){            if(grid[i][j]=='1'){                dfsFill(grid,i,j);                count++;            }        }    return count;}private void dfsFill(char[][] grid,int i, int j){    if(i>=0 && j>=0 && i<grid.length && j<grid[0].length&&grid[i][j]=='1'){        grid[i][j]='0';        dfsFill(grid, i + 1, j);        dfsFill(grid, i - 1, j);        dfsFill(grid, i, j + 1);        dfsFill(grid, i, j - 1);    }}
BFS

public int numIslands(char[][] grid) {    int count=0;    for(int i=0;i<grid.length;i++)        for(int j=0;j<grid[0].length;j++){            if(grid[i][j]=='1'){                bfsFill(grid,i,j);                count++;            }        }    return count;}private void bfsFill(char[][] grid,int x, int y){    grid[x][y]='0';    int n = grid.length;    int m = grid[0].length;    LinkedList<Integer> queue = new LinkedList<Integer>();      int code = x*m+y;      queue.offer(code);      while(!queue.isEmpty())      {          code = queue.poll();          int i = code/m;          int j = code%m;          if(i>0 && grid[i-1][j]=='1')    //search upward and mark adjacent '1's as '0'.        {              queue.offer((i-1)*m+j);              grid[i-1][j]='0';          }          if(i<n-1 && grid[i+1][j]=='1')  //down        {              queue.offer((i+1)*m+j);              grid[i+1][j]='0';          }          if(j>0 && grid[i][j-1]=='1')  //left        {              queue.offer(i*m+j-1);              grid[i][j-1]='0';          }          if(j<m-1 && grid[i][j+1]=='1')  //right        {              queue.offer(i*m+j+1);              grid[i][j+1]='0';          }    } }

二叉树的层次遍历


// version 1: BFSpublic class Solution {    public List<List<Integer>> levelOrder(TreeNode root) {        List result = new ArrayList();        if (root == null) {            return result;        }        Queue<TreeNode> queue = new LinkedList<TreeNode>();        queue.offer(root);        while (!queue.isEmpty()) {            ArrayList<Integer> level = new ArrayList<Integer>();            int size = queue.size();            for (int i = 0; i < size; i++) {                TreeNode head = queue.poll();                level.add(head.val);                if (head.left != null) {                    queue.offer(head.left);                }                if (head.right != null) {                    queue.offer(head.right);                }            }            result.add(level);        }        return result;    }}// version 2:  DFSpublic class Solution {    /**     * @param root: The root of binary tree.     * @return: Level order a list of lists of integer     */    public List<List<Integer>> levelOrder(TreeNode root) {        List<List<Integer>> results = new ArrayList<List<Integer>>();                if (root == null) {            return results;        }                int maxLevel = 0;        while (true) {            List<Integer> level = new ArrayList<Integer>();            dfs(root, level, 0, maxLevel);            if (level.size() == 0) {                break;            }                        results.add(level);            maxLevel++;        }                return results;    }        private void dfs(TreeNode root,                     List<Integer> level,                     int curtLevel,                     int maxLevel) {        if (root == null || curtLevel > maxLevel) {            return;        }                if (curtLevel == maxLevel) {            level.add(root.val);            return;        }                dfs(root.left, level, curtLevel + 1, maxLevel);        dfs(root.right, level, curtLevel + 1, maxLevel);    }}// version 3: BFS. two queuespublic class Solution {    /**     * @param root: The root of binary tree.     * @return: Level order a list of lists of integer     */    public List<List<Integer>> levelOrder(TreeNode root) {        List<List<Integer>> result = new ArrayList<List<Integer>>();        if (root == null) {            return result;        }                List<TreeNode> Q1 = new ArrayList<TreeNode>();        List<TreeNode> Q2 = new ArrayList<TreeNode>();        Q1.add(root);        while (Q1.size() != 0) {            List<Integer> level = new ArrayList<Integer>();            Q2.clear();            for (int i = 0; i < Q1.size(); i++) {                TreeNode node = Q1.get(i);                level.add(node.val);                if (node.left != null) {                    Q2.add(node.left);                }                if (node.right != null) {                    Q2.add(node.right);                }            }                        // swap q1 and q2            List<TreeNode> temp = Q1;            Q1 = Q2;            Q2 = temp;                        // add to result            result.add(level);        }                return result;    }}// version 4: BFS, queue with dummy nodepublic class Solution {    /**     * @param root: The root of binary tree.     * @return: Level order a list of lists of integer     */    public List<List<Integer>> levelOrder(TreeNode root) {        List<List<Integer>> result = new ArrayList<List<Integer>>();        if (root == null) {            return result;        }                Queue<TreeNode> Q = new LinkedList<TreeNode>();        Q.offer(root);        Q.offer(null); // dummy node                List<Integer> level = new ArrayList<Integer>();        while (!Q.isEmpty()) {            TreeNode node = Q.poll();            if (node == null) {                if (level.size() == 0) {                    break;                }                result.add(level);                level = new ArrayList<Integer>();                Q.offer(null); // add a new dummy node                continue;            }                        level.add(node.val);            if (node.left != null) {                Q.offer(node.left);            }            if (node.right != null) {                Q.offer(node.right);            }        }                return result;    }}


原创粉丝点击