286. Walls and Gates
DFS: 思路是,搜索0的位置,每找到一个0,以其周围四个相邻点为起点,开始 DFS 遍历,并带入深度值1,如果遇到的值大于当前深度值,将位置值赋为当前深度值,并对当前点的四个相邻点开始DFS遍历,注意此时深度值需要加1
class Solution { public void wallsAndGates(int[][] rooms) { for(int i = 0; i < rooms.length; i++){ for(int j = 0; j < rooms[0].length; j++){ if(rooms[i][j] == 0) dfs(rooms, i, j, 0); } } } private void dfs(int[][] rooms, int i, int j, int depth){ if(i < 0 || i >= rooms.length || j < 0 || j >= rooms[0].length || rooms[i][j] < depth) return; rooms[i][j] = depth; dfs(rooms, i + 1, j, depth + 1); dfs(rooms, i - 1, j, depth + 1); dfs(rooms, i, j + 1, depth + 1); dfs(rooms, i, j - 1, depth + 1); } }
339. Nested List Weight Sum
class Solution { public int depthSum(List<NestedInteger> nestedList) { if(nestedList == null || nestedList.size() == 0) return 0; return dfs(nestedList, 1); } private int dfs(List<NestedInteger> nestedList, int depth){ int sum = 0; for(NestedInteger ni : nestedList){ if(ni.isInteger()){ sum += depth * ni.getInteger(); }else{ sum += dfs(ni.getList(), depth + 1); } } return sum; } }
364. Nested List Weight Sum II
这题要求权重随着层数增加而减少,用BFS,每一层都先把Integer添加到level中,当这层循环结束时level添加进sum中,但是level不归零,上一层的Integer还在level中,所以每多一层就要多计算一次。
class Solution { public int depthSumInverse(List<NestedInteger> nestedList) { if(nestedList == null || nestedList.size() == 0) return 0; Queue<NestedInteger> q = new LinkedList<>(); q.addAll(nestedList); int sum = 0, level = 0; while(!q.isEmpty()){ int size = q.size(); while(size-- > 0){ NestedInteger ni = q.poll(); if(ni.isInteger()){ level += ni.getInteger(); }else{ q.addAll(ni.getList()); } } sum += level; } return sum; } }