public int numIslands(char[][] grid) { int counter = 0; int n = grid.length; if (n == 0) return 0; int m = grid[0].length; if (m == 0) return 0; int[][] direct = new int[][] {{0, 1}, {0, -1}, {1, 0}, {-1, 0}}; for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { if (grid[i][j] == '1') { counter++; ArrayDeque<Integer> q = new ArrayDeque<Integer>(); grid[i][j] = 0; q.add(i); q.add(j); while (!q.isEmpty()) { int r = q.poll(); int c = q.poll(); for (int[] d : direct) { int rr = d[0] + r; int cc = d[1] + c; if (rr >= 0 && rr < n && cc >= 0 && cc < m && grid[rr][cc] == '1') { grid[rr][cc] = 0; q.add(rr); q.add(cc); } } } } } } return counter; }
public List<List<Integer>> zigzagLevelOrder(TreeNode root) { List<List<Integer>> r = new ArrayList<List<Integer>>(); ArrayDeque<TreeNode> q = new ArrayDeque<TreeNode>(); if (root == null) return r; q.offer(root); boolean reversedOrder = false; while (!q.isEmpty()) { int len = q.size(); List<Integer> level = new LinkedList<Integer>(); for (int i = 0; i < len; i++) { TreeNode n = q.poll(); if (reversedOrder) level.add(0, n.val); else level.add(n.val); if (n.left != null) q.offer(n.left); if (n.right != null) q.offer(n.right); } r.add(level); reversedOrder = !reversedOrder; } return r; }