Given a undirected graph, a node and a target, return the nearest node to given node which value of it is target, return NULL if you can't find.
There is a mapping store the nodes' values in the given parameters.
Notice
It's guaranteed there is only one available solution
Example
2------3 - 5
\ | |
\ | |
\ | |
\ | |
1 -- 4
Give a node 1, target is 50
there a hash named values which is [3,4,10,50,50], represent:
Value of node 1 is 3
Value of node 2 is 4
Value of node 3 is 10
Value of node 4 is 50
Value of node 5 is 50
Return node 4
思路
从当前节点开始BFS。比较每一个遍历的点mapping出来的值是不是target。如果是就return。如果不是,把这个点的邻居都加入queue里。注意加的时候先检测一下要加的点有没有被遍历过。
Code
/** * Definition for graph node. * class UndirectedGraphNode { * 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) { // Write your code here if (node == null) { return null; } Queue<UndirectedGraphNode> queue = new LinkedList<>(); queue.offer(node); HashSet<UndirectedGraphNode> hash = new HashSet<>(); hash.add(node); while (!queue.isEmpty()) { int size = queue.size(); for (int i = 0; i < size; i++) { UndirectedGraphNode currNode = queue.poll(); if (values.get(currNode) == target) { return currNode; } else { for (UndirectedGraphNode nei : currNode.neighbors) { if (!hash.contains(nei)) { queue.offer(nei); hash.add(nei); } } } } } return null; } }