BFS

二叉树的最小深度

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */

class Solution {
    public int minDepth(TreeNode root) {
        int result = 0;
        if (root == null) {
            return result;
        }
        
        Queue<TreeNode> queue = new LinkedList<>();
        queue.offer(root);
        result++;
        while (!queue.isEmpty()) {
            int m = queue.size();
            for (int i = 0; i < m; i++) {
                TreeNode current = queue.poll();
                if (current.left != null) {
                    queue.offer(current.left);
                }
                if (current.right != null) {
                    queue.offer(current.right);
                }

                if (current.left == null && current.right == null) {
                    return result;
                }
            }
            result++;
        }
        return result;
    }
}

打开转盘锁

class Solution {
    public int openLock(String[] deadends, String target) {
        return bfs("0000", deadends, target);
    }
    public int bfs(String current, String[] deadends, String target) {
        Queue<String> queue = new LinkedList<>();
        queue.offer(current);
        int result = 0;
        Set<String> seen = new HashSet<>();
        while (!queue.isEmpty()) {
            int m = queue.size();
            for (int i = 0; i < m; i++) {
                String now = queue.poll();
                if (now.equals(target)) {
                    return result;
                }
                if (seen.contains(now)) {
                    continue;
                }
                seen.add(now); 
                if (contains(now, deadends)) {
                    continue;
                }
                queue.offer(change(1, 0, 0, 0, now));
                queue.offer(change(-1, 0, 0, 0, now));
                queue.offer(change(0, 1, 0, 0, now));
                queue.offer(change(0, -1, 0, 0, now));
                queue.offer(change(0, 0, 1, 0, now));
                queue.offer(change(0, 0, -1, 0, now));
                queue.offer(change(0, 0, 0, 1, now));
                queue.offer(change(0, 0, 0, -1, now));
            }
            result++;
        }
        return -1;
    }

    public boolean contains(String current, String[] deadends) {
        for (int i = 0; i < deadends.length; i++) {
            if (deadends[i].equals(current)) {
                return true;
            }
        }
        return false;
    }

    public String change(int one, int two, int three, int four, String current) {
        char o = (char) (current.charAt(0) + one);
        char tw = (char) (current.charAt(1) + two);
        char th = (char) (current.charAt(2) + three);
        char f = (char) (current.charAt(3) + four);
        if (o > '9') {
            o = '0';
        }
        if (tw > '9') {
            tw = '0';
        }
        if (th > '9') {
            th = '0';
        }
        if (f > '9') {
            f = '0';
        }

        if (o < '0') {
            o = '9';
        }
        if (tw < '0') {
            tw = '9';
        }
        if (th < '0') {
            th = '9';
        }
        if (f < '0') {
            f = '9';
        }
        StringBuilder sb = new StringBuilder();
        return sb.append(o).append(tw).append(th).append(f).toString();
    }
}

判断二分图

class Solution {
    private static final int UNDEFINE = 0;
    private static final int RED = 1;
    private static final int GREEN = 2;

    public boolean isBipartite(int[][] graph) {
        int[] colores = new int[graph.length];
        int n = graph.length;
        Arrays.fill(colores, UNDEFINE);
        for (int i = 0; i < n; i++) {
            if (colores[i] != UNDEFINE) {
                continue;
            }
            Queue<Integer> queue = new LinkedList<>();
            queue.add(i);
            colores[i] = RED;
            while (!queue.isEmpty()) {
                int m = queue.poll();
                int color = colores[m] == RED ? GREEN : RED;
                for (Integer integer : graph[m]) {
                    if (colores[integer] == UNDEFINE) {
                        queue.offer(integer);
                        colores[integer] = color;
                    } else if (colores[integer] != color) {
                        return false;
                    }
                }
            }
        }
        
        return true;
    }
}

01 矩阵

class Solution {
    int[][] move = new int[][] {{1, 0}, {0, 1}, {-1, 0}, {0, -1}};
    public int[][] updateMatrix(int[][] matrix) {
        int[][] result = new int[matrix.length][matrix[0].length];
        for (int i = 0; i < matrix.length; i++) {
            for (int j = 0; j < matrix[0].length; j++) {
                if (matrix[i][j] == 0) {
                    result[i][j] = 0;
                } else {
                    int depth = 1;
                    Queue<int[]> queue = new LinkedList<>();
                    queue.offer(new int[] {i, j});
                    boolean flag = true;
                    while (!queue.isEmpty() && flag) {
                        int m = queue.size();
                        for (int k = 0; k < m && flag; k++) {
                            int[] xy = queue.poll();
                            int x = xy[0];
                            int y = xy[1];
                            for (int l = 0; l < move.length; l++) {
                                int xn = x + move[l][0];
                                int yn = y + move[l][1];
                                if (xn < 0 || xn > matrix.length - 1 || yn < 0 || yn > matrix[0].length - 1) {
                                    continue;
                                }
                                if (matrix[xn][yn] == 0) {
                                    result[i][j] = depth;
                                    flag = false;
                                    break;
                                } else {
                                    queue.offer(new int[]{xn, yn});
                                }
                            }
                        }
                        depth++;
                    }
                }
            }
        }
        return result;
    }
}

腐烂的橘子

class Solution {
    private static int[][] move = new int[][] {{1,0},{0,1},{-1,0},{0,-1}};
    public int orangesRotting(int[][] grid) {
        int m = grid.length;
        int n = grid[0].length;
        boolean[][] visited = new boolean[m][n];

        Queue<int[]> queue = new LinkedList<>();
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                if (grid[i][j] == 2) {
                    queue.offer(new int[] {i, j});
                }
            }
        }
        int ans = 0;
        while (!queue.isEmpty()) {
            
            boolean flag = true;
            int qm = queue.size();
            for (int j = 0; j < qm; j++) {
                int[] xy = queue.poll();
                int x = xy[0];
                int y = xy[1];
                visited[x][y] = true;
                for (int i = 0; i < move.length; i++) {
                    int xn = x + move[i][0];
                    int yn = y + move[i][1];
                    if (xn < 0 || yn < 0 || xn > m - 1 || yn > n - 1) {
                        continue;
                    }
                    if (visited[xn][yn]) {
                        continue;
                    }
                    if (grid[xn][yn] == 0) {
                        continue;
                    }
                    if (grid[xn][yn] == 1) {
                        grid[xn][yn] = 2;
                        queue.offer(new int[] {xn, yn});
                        if (flag) {
                            ans++;
                            flag = false;
                        }
                    }
                }
            }
        }
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                if (grid[i][j] == 1) {       
                    return -1;
                }
            }
        }
        return ans;
    }
}

二叉树的层次遍历 II

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public List<List<Integer>> levelOrderBottom(TreeNode root) {
        if (root == null) {
            return new ArrayList<>();
        }
        LinkedList<List<Integer>> result = new LinkedList<>();
        Queue<TreeNode> queue = new LinkedList<>();
        queue.offer(root);
        while (!queue.isEmpty()) {
            int m = queue.size();
            List<Integer> list = new ArrayList<>();
            for (int i = 0; i < m; i++) {
                TreeNode current = queue.poll();
                list.add(current.val);
                if (current.left != null) {
                    queue.offer(current.left);
                }
                if (current.right != null) {
                    queue.offer(current.right);
                }
            }
            result.addFirst(list);
        }
        return result;
    }
}

二叉树的锯齿形层次遍历

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public List<List<Integer>> zigzagLevelOrder(TreeNode root) {
        if (root == null) {
            return new ArrayList<>();
        }
        LinkedList<List<Integer>> result = new LinkedList<>();
        Queue<TreeNode> queue = new LinkedList<>();

        queue.offer(root);
        boolean asc = true;
        while (!queue.isEmpty()) {
            int m = queue.size();
            LinkedList<Integer> temp = new LinkedList<>();
            for (int i = 0; i < m; i++) {
                TreeNode current = queue.poll();
                if (asc) {
                    temp.addLast(current.val);
                } else {
                    temp.addFirst(current.val);
                }
                if (current.left != null) {
                    queue.offer(current.left);
                }
                if (current.right != null) {
                    queue.offer(current.right);
                }
            }
            asc = !asc;
            result.add(temp);
        }
        return result;
    }
}

课程表

class Solution {
    public boolean canFinish(int numCourses, int[][] prerequisites) {
        int[] visited = new int[numCourses];
        List<List<Integer>> ad = new ArrayList<>();

        for (int i = 0; i < visited.length; i++) {
            ad.add(new ArrayList<>());
        }
        for (int i = 0; i < prerequisites.length; i++) {
            visited[prerequisites[i][0]]++;
            List<Integer> list = ad.get(prerequisites[i][1]);
            list.add(prerequisites[i][0]);
        }

        Queue<Integer> queue = new LinkedList<>();
        for (int i = 0; i < numCourses; i++) {
            if (visited[i]==0) {
                queue.offer(i);
            }
        }

        while (!queue.isEmpty()) {
            int c = queue.poll();
            numCourses--;
            for (Integer integer : ad.get(c)) {
                visited[integer]--;
                if (visited[integer] == 0) {
                    queue.offer(integer);
                }
            }
            
        }
        return numCourses == 0;
    }
}

课程表 II

class Solution {
    public int[] findOrder(int numCourses, int[][] prerequisites) {
        int[] visited = new int[numCourses];
        List<List<Integer>> ad = new ArrayList<>();
        for (int i = 0; i < numCourses; i++) {
            ad.add(new ArrayList<>());
        }
        for (int i = 0; i < prerequisites.length; i++) {
            visited[prerequisites[i][0]]++;
            List<Integer> list = ad.get(prerequisites[i][1]);
            list.add(prerequisites[i][0]);
        }

        Queue<Integer> queue = new LinkedList<>();

        for (int i = 0; i < visited.length; i++) {
            if (visited[i] == 0) {
                queue.offer(i);
            }
        }
        int[] result = new int[numCourses];
        int n = numCourses;
        while(!queue.isEmpty()) {
            Integer c = queue.poll();
            result[n - numCourses] = c;
            numCourses--;
            for (Integer integer : ad.get(c)) {
                visited[integer]--;
                if (visited[integer] == 0) {
                    queue.offer(integer);
                }
            }
        }

        return numCourses == 0 ? result : new int[0];
    }
}

完全平方数

class Solution {
    // public int numSquares(int n) {
    //      int[] dp = new int[n+1];
    //      Arrays.fill(dp, n);
    //      dp[1] = 1;
    //      dp[0] = 0;
    //      for (int i = 2; i < n + 1; i++) {
    //          for (int j = 0; j*j <= i; ++j) {
    //             dp[i] = Math.min(dp[i - j*j], dp[i]);
    //          }
    //          dp[i] = dp[i] + 1;
    //      }
    //      return dp[n];
    // }
    public int numSquares(int n) {

        int[] visited = new int[n+1];
        Arrays.fill(visited, -1);
        return fun(n, visited);
    }

    public int fun(int n, int[] visited) {
        if (visited[n] != -1) {
            return visited[n];
        }
        if (n==0) {
            return 0;
        }
        int result = n;
        for (int i = 1; i*i <= n; i++) {
            result = Math.min(result,  fun(n-i*i, visited));
        }
        visited[n] = result + 1;
        return result + 1;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值