618.搜索图中结点

描述

给定一张无向图,一个结点以及一个目标值,返回距离这个结点最近且值为目标值的结点,如果不能找到则返回 NULL。
在给出的参数中, 我们用 map 来存结点的值

注意事项

保证答案唯一

样例

    2------3  5
     \     |  | 
      \    |  |
       \   |  |
        \  |  |
        1 --4

给出 节点1,目标值为 50
有个哈希表的值为[3,4,10,50,50],表示:

    节点1的值为3
    节点2的值为4
    节点3的值为10
    节点4的值为50
    节点5的值为50

返回 节点4
实际上考的就是BFS模板,如果只存在一个最近点用下列代码即可,若存在几个则需分层,参考之前二叉树分层

代码

/**
 * Definition for graph node.
 * class GraphNode {
 *     int label;
 *     ArrayList<UndirectedGraphNode> neighbors;
 *     UndirectedGraphNode(int x) { 
 *         label = x; neighbors = new ArrayList<UndirectedGraphNode>(); 
 *     }
 * };
 */
public class Solution {
    /**
     * @param graph a list of Undirected graph node
     * @param values a hash mapping, <UndirectedGraphNode, (int)value>
     * @param node an Undirected graph node
     * @param target an integer
     * @return the a node
     */
    public UndirectedGraphNode searchNode(ArrayList<UndirectedGraphNode> graph,
                                          Map<UndirectedGraphNode, Integer> values,
                                          UndirectedGraphNode node,
                                          int target) {
        Queue<UndirectedGraphNode> queue = new LinkedList<UndirectedGraphNode>();
        Set<UndirectedGraphNode> hash = new HashSet<UndirectedGraphNode>();

        queue.offer(node);
        hash.add(node);

        while (!queue.isEmpty()) {
            UndirectedGraphNode head = queue.poll();
            // 对图用队列做BFS,碰到的第一个点一定是最近的目标点?
            if (values.get(head) == target) {
                return head;
            }
            for (UndirectedGraphNode nei : head.neighbors) {
                if (!hash.contains(nei)){
                    queue.offer(nei);
                    hash.add(nei);
                }
            }
        }
        return null;
    }
}

本题典型的的BST求最短路径问题,值得注意的是结点值用哈希方式存储,注意调用方法(values.get(head))不是head.vals

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容