每日一题
133.克隆图
bfs和dfs在图问题上的运用
DFS
DFS注意要在递归之前写好退出递归的条件。
class Solution {
public Node cloneGraph(Node node) {
Map<Node, Node> lookup = new HashMap<>();
return dfs(node, lookup);
}
private Node dfs(Node node, Map<Node,Node> lookup) {
if (node == null) return null;
if (lookup.containsKey(node)) return lookup.get(node);
Node clone = new Node(node.val, new ArrayList<>());
lookup.put(node, clone);
for (Node n : node.neighbors)clone.neighbors.add(dfs(n,lookup));
return clone;
}
}
作者:powcai
链接:https://leetcode-cn.com/problems/clone-graph/solution/dfs-he-bfs-by-powcai/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
BFS
BFS:
先建立队列,用循环表示队列不空,把第一个压入队列,然后迭代他的相邻元素,要是符合要求,就入队列。重复该过程。有额外操作就在迭代的这个循环里进行(如本题在for循环里面if判断是否应该入队之后,将要入队的元素加到clone的邻接元素集合里就算是额外操作,具体问题有不同的具体操作)
public class Solution1 {
public Node cloneGraph(Node node) {
if(node == null)
return null;
Map<Node,Node> visited = new HashMap<>();
Deque<Node> q = new LinkedList<>();
Node clone = new Node(node.val,new ArrayList<>());
visited.put(node, clone);
q.add(node);
while(!q.isEmpty()) {
Node first = q.poll();
for(Node n:first.neighbors) {
if(!visited.containsKey(n)) {
visited.put(n, new Node(n.val,new ArrayList<>()));
q.add(n);
}visited.get(first).neighbors.add(visited.get(n));
}
}
return clone;
}
}
303.区域和检索
收获:
在所有方法前面int[] sum
在第一个方法里通过传进来的参数nums[]的长度,给sum分配new具体地址空间。
在其他方法里使用sum[]。
解题思想
这个方法好,类似于双指针的思想,说是动态规划也可以
private int[] sum;
public NumArray(int[] nums) {
sum = new int[nums.length + 1];
for (int i = 0; i < nums.length; i++) {
sum[i + 1] = sum[i] + nums[i];
}
}
public int sumRange(int i, int j) {
return sum[j + 1] - sum[i];
}
作者:LeetCode
链接:https://leetcode-cn.com/problems/range-sum-query-immutable/solution/qu-yu-he-jian-suo-shu-zu-bu-ke-bian-by-leetcode/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。