133 399

133. Clone Graph

我们也可以使用 BFS 来遍历图,使用队列 queue 进行辅助,还是需要一个 HashMap 来建立原图结点和克隆结点之间的映射。先克隆当前结点,然后建立映射,并加入 queue 中,进行 while 循环。在循环中,取出队首结点,遍历其所有 neighbor 结点,若不在 HashMap 中,我们根据 neigbor 结点值克隆一个新 neighbor 结点,建立映射,并且排入 queue 中。然后将 neighbor 结点在 HashMap 中的映射结点加入到克隆结点的 neighbors 数组中即可

Map.containsKey() :是否含有key

Map.get(key) :  获取key对应的value

class Solution {
    public Node cloneGraph(Node node) {
        if(node == null) return null;
        Map<Node, Node> map = new HashMap<>();
        Node newNode = new Node(node.val, new ArrayList<>());
        map.put(node, newNode);
        
        Queue<Node> queue = new LinkedList<>();
        queue.add(node);
        while(!queue.isEmpty()){
            Node cur = queue.poll();
            for(Node nei : cur.neighbors){
                if(!map.containsKey(nei)){
                    map.put(nei, new Node(nei.val, new ArrayList<>()));
                    queue.add(nei);
                }
                map.get(cur).neighbors.add(map.get(nei));
            }
        }
        return newNode;
    }
}

399. Evaluate Division

用有向图的方法做,先存入图中,再用DFS遍历。

Map.keySet() : 获取map对应的所有的key值。

class Solution {
    public double[] calcEquation(List<List<String>> equations, double[] values, List<List<String>> queries) {
        Map<String, Map<String, Double>> g = new HashMap<>();
        buildGraph(g, equations, values);
        
        double[] res = new double[queries.size()];
        Arrays.fill(res, -1.0);
        int index = 0;
        for(List<String> q : queries){
            String a = q.get(0);
            String b = q.get(1);
            
            if(!g.containsKey(a) || !g.containsKey(b)){
                index++;
                continue;
            }else{
                dfs(g, a, b, res, index, new HashSet<>(), 1.0);
                index++;
            }
        }
        return res;
    }
    
    private void dfs(Map<String, Map<String, Double>> g, String a, String b, double[] res,
                     int index, Set<String> visited, double tmp){
        visited.add(a);
        
        if(g.get(a) == null || g.get(a).size() == 0){
            return;
        }
        if(g.get(a).containsKey(b)){
            res[index] = g.get(a).get(b) * tmp;
            return;
        }
        
        for(String next : g.get(a).keySet()){
            if(visited.contains(next)) continue;
            dfs(g, next, b, res, index, visited, g.get(a).get(next)*tmp);
        }
    }
    
    private void buildGraph(Map<String, Map<String, Double>> g, List<List<String>> equations, double[] values){
        int index = 0;
        for(List<String> e : equations){
            String a = e.get(0);
            String b = e.get(1);
            g.putIfAbsent(a, new HashMap<>());
            g.putIfAbsent(b, new HashMap<>());
            g.get(a).put(b, values[index]);
            g.get(b).put(a, 1.0 / values[index]);
            index++;
            g.get(a).put(a, 1.0);
            g.get(b).put(b, 1.0);
        }
    }
}

 

上一篇:【DB笔试面试399】现需要查询参加了课程ID为C10的考试,并且分数排在前10名的学生,以下哪项语句能够实现此功能()


下一篇:康皱面膜分销商城管理app系统开发18819301608微电