classSolution{int[][] move =newint[][]{{1,0},{0,1},{-1,0},{0,-1}};publicint[][]updateMatrix(int[][] matrix){int[][] result =newint[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 =newLinkedList<>();
queue.offer(newint[]{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(newint[]{xn, yn});}}}
depth++;}}}}return result;}}
classSolution{privatestaticint[][] move =newint[][]{{1,0},{0,1},{-1,0},{0,-1}};publicintorangesRotting(int[][] grid){int m = grid.length;int n = grid[0].length;boolean[][] visited =newboolean[m][n];
Queue<int[]> queue =newLinkedList<>();for(int i =0; i < m; i++){for(int j =0; j < n; j++){if(grid[i][j]==2){
queue.offer(newint[]{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(newint[]{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;}}
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/classSolution{public List<List<Integer>>levelOrderBottom(TreeNode root){if(root == null){returnnewArrayList<>();}
LinkedList<List<Integer>> result =newLinkedList<>();
Queue<TreeNode> queue =newLinkedList<>();
queue.offer(root);while(!queue.isEmpty()){int m = queue.size();
List<Integer> list =newArrayList<>();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;}}
classSolution{publicint[]findOrder(int numCourses,int[][] prerequisites){int[] visited =newint[numCourses];
List<List<Integer>> ad =newArrayList<>();for(int i =0; i < numCourses; i++){
ad.add(newArrayList<>());}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 =newLinkedList<>();for(int i =0; i < visited.length; i++){if(visited[i]==0){
queue.offer(i);}}int[] result =newint[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 :newint[0];}}