计算除法java实现

class Solution {
    public double[] calcEquation(List<List<String>> equations, double[] values, List<List<String>> queries) {
        //这一题可以将我们的除法计算过程抽象成一个图来做运算,每一个除数与被除数抽象成图的一个节点,而除数和被除数的关系抽象成图的边,至于商则是除数上的一个属性,我们运用宇哥Map<String,Map<String,Double>>这样一个结构来存储每一个节点第一个key代表着被除数,第二个key代表除数,Double则代表着这个除法关系的商
        //首先我们需要将equation和values转化成一张使用如上关系表示的图结构
        Map<String,Map<String,Double>> graph = createGraph(equations,values);
        double[] result = new double[queries.size()];
        //对于每一个需要计算的queries表示的是图结构上一条路劲的乘积,所以我们遍历queries计算对图进行一个深度优先搜索计算出结果
        for(int i = 0;i < queries.size();i++){
            String from = queries.get(i).get(0);
            String to = queries.get(i).get(1);
            if(!graph.containsKey(from) || !graph.containsKey(to)){
                result[i] = -1.0;
            }else{
                Set<String> visited = new HashSet<>();
                result[i] = dfs(graph,from,to,visited);
            }
        }
        return result;
    }

    //构建图
    private Map<String,Map<String,Double>> createGraph(List<List<String>> equations, double[] values){
        Map<String,Map<String,Double>> graph = new HashMap<>();
        //遍历equtions对其中的每一个除法关系构建一个节点,并且创建节点的关系,相应的需要构建一条被除数到除数的除法关系的边
        for(int i = 0;i < equations.size();i++){
            String var1 = equations.get(i).get(0);
            String var2 = equations.get(i).get(1);
            //首先构建var1节点,并创建var1上的边
            graph.putIfAbsent(var1,new HashMap<String,Double>());
            graph.get(var1).put(var2,values[i]);
            //构建var2节点,并创建var2节点上面的边
            graph.putIfAbsent(var2,new HashMap<String,Double>());
            graph.get(var2).put(var1,1.0/values[i]);
        }
        return graph;
    }

    private Double dfs(Map<String,Map<String,Double>> graph,String from,String to,Set<String> visited){
        //如果from == to说明找到我们要寻找的节点
        if(from.equals(to)){
            return 1.0;
        }
        //表示访问过from了
        visited.add(from);
        //遍历from的每一个节点深度优先搜索
        for(Map.Entry<String,Double> entry : graph.get(from).entrySet()){
            String next = entry.getKey();
            if(!visited.contains(next)){
                double nextValue = dfs(graph,next,to,visited);
                if(nextValue > 0){
                    return entry.getValue() * nextValue;
                }
            }
        }
        visited.remove(from);
        //如果所有的节点都遍历结束了还没有找到说明本路径不存在我们要寻找的to节点返回一个负数作为标识
        return -1.0;
    }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值