leetcode 150道题 计划花两个月时候刷完,今天(第四十一天)完成了2道(82-83)150:
82.(133. 克隆图)题目描述:
给你无向 连通 图中一个节点的引用,请你返回该图的 深拷贝(克隆)。
图中的每个节点都包含它的值 val(int) 和其邻居的列表(list[Node])。
class Node {
public int val;
public List<Node> neighbors;
}
第一版(这个之前有过是拷贝二叉树的时候和这个类似,利用map 映射就是当前节点和当前节点的复制节点)
class Solution {
Map<Node,Node> map=new HashMap();
public Node cloneGraph(Node node) {
if(node==null){
return null;
}
if(map.containsKey(node)){
return map.get(node);
}
Node cloneNode= new Node(node.val);
map.put(node,cloneNode);
for(Node neighbor:node.neighbors){
cloneNode.neighbors.add(cloneGraph(neighbor));
}
return map.get(node);
}
}
第83题顺序应该是 leetcode 的 《399. 除法求值》但是实在是看不懂,找了一个类似的比这个简单的,但是还是看不懂,只是把解题的代码默写了一遍。。
83.(990. 等式方程的可满足性)题目描述:
给定一个由表示变量之间关系的字符串方程组成的数组,每个字符串方程 equations[i] 的长度为 4,并采用两种不同的形式之一:"a==b" 或 "a!=b"。在这里,a 和 b 是小写字母(不一定不同),表示单字母变量名。
只有当可以将整数分配给变量名,以便满足所有给定的方程时才返回 true,否则返回 false。
第一版(解题默写版)
class Solution {
public boolean equationsPossible(String[] equations) {
// 26 字母全部创建为节点
int[] nodes=new int[26];
// 将初始化节点的父节点设置为自己
for(int i=0;i<26;i++){
nodes[i]=i;
}
// 先遍历相等的,建立关系
for(String equation:equations){
char[] chars=equation.toCharArray();
if(chars[1]=='='){
int index1=chars[0]-'a';
int index2=chars[3]-'a';
union(nodes,index1,index2);
}
}
// 再遍历不相等的看是否冲突
for(String equation:equations){
char[] chars=equation.toCharArray();
if(chars[1]=='!'){
int index1=chars[0]-'a';
int index2=chars[3]-'a';
if(find(nodes,index1)==find(nodes,index2)){
return false;
}
}
}
return true;
}
// 合并节点,将第一个的父节点指向第二个
public void union(int[] nodes,int index1,int index2){
nodes[find(nodes,index1)]=find(nodes,index2);
}
// 查找对应节点的父节点
public int find(int[] nodes,int index){
while(nodes[index]!=index){
nodes[index]=nodes[nodes[index]];
index=nodes[index];
}
return index;
}
}
图这一块也太难了。。。。好折磨,就这个 83 《399. 除法求值》卡了我 好几天,每天一打开一看。。还是不会太打击人了。。明天开始,我准备把图这一块的先跳过去。。
加油,这几天真的太打击人了,但是今天leetcode 周赛我做出来了两道,哈哈哈进步了。
早日跳槽!!!