133.克隆图(DFS+BFS)
/*
// Definition for a Node.
class Node {
public int val;
public List<Node> neighbors;
public Node() {
val = 0;
neighbors = new ArrayList<Node>();
}
public Node(int _val) {
val = _val;
neighbors = new ArrayList<Node>();
}
public Node(int _val, ArrayList<Node> _neighbors) {
val = _val;
neighbors = _neighbors;
}
}
*/
class Solution {
public Node cloneGraph(Node node) {
Map<Node, Node> map = new HashMap<>(); //map中的key存储原始节点,value存储其对应的克隆节点
return dfs(node, map);
}
//克隆node节点和其邻接节点
public Node dfs(Node node, Map<Node, Node> map) {
if(node == null) return null;
//如果map中已存在node这个key,则说明这个节点已经被克隆过了,只需把对应的克隆节点value返回
if(map.containsKey(node)) return map.get(node);
//map中不存在node,则克隆该节点,并把这一对节点存入map中
Node colon = new Node(node.val, new ArrayList<>());
map.put(node, colon);
//克隆node节点的邻接节点
for(Node temp : node.neighbors) {
colon.neighbor.add(dfs(temp, map));
}
//返回克隆好的节点
return colon;
}
}
134.加油站
class Solution {
public int canCompleteCircuit(int[] gas, int[] cost) {
int len = gas.length;
int sum = 0; //当前油箱里的油
int minSum = Integer.MAX_VALUE; //油箱里剩余最小的油
int minIndex = 0; //此时所在的加油站编号
for(int i = 0; i < len; i++) {
sum += gas[i] - cost[i]; //当为负的,说明加油站的油小于需要消耗的油
if(sum < minSum) {
minSum = sum;
minIndex = i;
}
}
//当最后油箱里的油小于0时,说明不能环路一圈;
//大于0时,油箱油量最低点的下一个点,因为此时油站的油大于消耗的油,所以以这个点为出发点
return sum < 0 ? -1 : (minIndex + 1) % len;
}
}