[LeetCode] 399. Evaluate Division

题:https://leetcode.com/problems/evaluate-division/

题目大意

给定 equations 和式子结果 values ,求 queries 的结果。

思路

dfs

先构建一个图。
queries 是两点之间 边的权重 乘积。

class Solution {
    double dfs(List<Double> resList,Map<String,Map<String,Double>> map,Set<String> hasVistedSet,String os,String ds){
        if(os.equals(ds))
            return 1;
        Map<String,Double> curmap = map.get(os);
        for(Map.Entry<String,Double> entry:curmap.entrySet()){
            if(hasVistedSet.contains(entry.getKey())) 
                continue;
            hasVistedSet.add(entry.getKey());
            double nextPart = dfs(resList,map,hasVistedSet,entry.getKey(),ds);
            if(nextPart>0)
                return entry.getValue() * nextPart;
        }
        return -1;
    }


    public double[] calcEquation(String[][] equations, double[] values, String[][] queries) {
        Map<String,Map<String,Double>> map = new HashMap();
        for(int i =0 ; i < equations.length;i++){
            String[] equation = equations[i];
            if(!map.containsKey(equation[0]))
                map.put(equation[0],new HashMap());
            map.get(equation[0]).put(equation[1],values[i]);
            if(!map.containsKey(equation[1]))
                map.put(equation[1],new HashMap());
            map.get(equation[1]).put(equation[0],1/values[i]);
        }
        List<Double> resList = new ArrayList<>();

        for(String[] query:queries){
            String os = query[0];
            String ds = query[1];
            if(!map.containsKey(os))
                resList.add(-1.0);
            else
                resList.add(dfs(resList,map,new HashSet(),os,ds));
        }
        double[] resArr = new double[resList.size()];
        int i = 0;
        for(double res:resList){
            resArr[i++] = res;
        }
        return resArr;
    }
}

并查集

将所有 数 化为一个基数的 倍数。

class BaseNumPair{
    String baseNum;
    double ratio;
    public BaseNumPair(String baseNum,double ratio){
        this.baseNum = baseNum;
        this.ratio = ratio;
    }
}

class UnionFindSet{
    Map<String,BaseNumPair> map = new HashMap();
    
    BaseNumPair find(String s){
        if(!map.containsKey(s))
            return null;
        BaseNumPair tBaseNumPair = map.get(s);
        if(!tBaseNumPair.baseNum.equals(s)){
            BaseNumPair nBaseNumPair = find(tBaseNumPair.baseNum);
            tBaseNumPair.baseNum = nBaseNumPair.baseNum;
            tBaseNumPair.ratio = tBaseNumPair.ratio * nBaseNumPair.ratio;
        }
        return tBaseNumPair;
    }
    void union(String s,String p,double ratio){
        boolean hasMapS = map.containsKey(s);
        boolean hasMapP = map.containsKey(p);
        if(!hasMapS&&!hasMapP){
            map.put(s,new BaseNumPair(p,ratio));
            map.put(p,new BaseNumPair(p,1));
        }else if(!hasMapS){
            map.put(s,new BaseNumPair(p,ratio));
        }else if(!hasMapP){
            map.put(p,new BaseNumPair(s,1/ratio));
        }else{
            BaseNumPair sBaseNumPair = find(s);
            BaseNumPair pBaseNumPair = find(p);
            
            BaseNumPair rSBaseNumPair = map.get(sBaseNumPair.baseNum);
            BaseNumPair rPBaseNumPair = map.get(pBaseNumPair.baseNum);
            
            rSBaseNumPair.baseNum = rPBaseNumPair.baseNum;
            rSBaseNumPair.ratio =  ratio * pBaseNumPair.ratio / sBaseNumPair.ratio;
        }
    }
}


class Solution {    
    public double[] calcEquation(String[][] equations, double[] values, String[][] queries) {
        UnionFindSet unionfindSet = new UnionFindSet();
        for(int i = 0 ; i < equations.length ;i++){
            unionfindSet.union(equations[i][0],equations[i][1],values[i]);
        }
        double[] res = new double[queries.length];
        int i = 0;
        for(String[] query:queries){
            BaseNumPair sBaseNumPair = unionfindSet.find(query[0]);
            BaseNumPair pBaseNumPair = unionfindSet.find(query[1]);
            if(sBaseNumPair==null || pBaseNumPair==null || !sBaseNumPair.baseNum.equals(pBaseNumPair.baseNum)){
                res[i++] = -1;
            }else{
                 res[i++] = sBaseNumPair.ratio/pBaseNumPair.ratio;
            }
        }
        return res;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值