面试经典150题(82-83)

本文讲述了作者计划用两个月时间刷LeetCode,记录了第82题(克隆图)的解法,利用哈希映射实现图的深拷贝;接着提到第83题(等式方程的可满足性),虽然看似困难,但通过建立并查集来检查变量分配的可行性。作者决定暂时跳过图相关难题,保持学习进度。
摘要由CSDN通过智能技术生成

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 周赛我做出来了两道,哈哈哈进步了。

早日跳槽!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值