【Lintcode】618. Search Graph Nodes

题目地址:

https://www.lintcode.com/problem/search-graph-nodes/description

给定一个无向图,再给定一个顶点和一个数字target,求距离该顶点最近的且值为target的顶点。

可以用BFS来做,一旦遍历到值为target的顶点就可以返回了。代码如下:

import java.util.*;

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: a node
     */
    public UndirectedGraphNode searchNode(ArrayList<UndirectedGraphNode> graph,
                                          Map<UndirectedGraphNode, Integer> values,
                                          UndirectedGraphNode node,
                                          int target) {
        // write your code here
        if (graph == null || graph.size() == 0) {
            return null;
        }
        // 如果起点的值就是target,直接返回起点
        if (values.get(node) == target) {
            return node;
        }
        
        Set<UndirectedGraphNode> visited = new HashSet<>();
        Queue<UndirectedGraphNode> queue = new LinkedList<>();
        queue.offer(node);
        visited.add(node);
        
        while (!queue.isEmpty()) {
        	// 从队列里取出一个顶点,接着遍历其邻居
            UndirectedGraphNode cur = queue.poll();
            for (UndirectedGraphNode neighbor : cur.neighbors) {
            	// 如果这个邻居未访问过,则进行下一步逻辑
                if (!visited.contains(neighbor)) {
                	// 如果这个邻居的值正好是target,则直接返回
                	if (values.get(neighbor) == target) {
                    	return neighbor;
                	}
                	// 否则加入队列以便下次访问,并记录其已被访问过
                    queue.offer(neighbor);
                    visited.add(neighbor);
                }
            }
        }
        
        return null;
    }
}

class UndirectedGraphNode {
    int label;
    ArrayList<UndirectedGraphNode> neighbors;
    UndirectedGraphNode(int x) {
        label = x;
        neighbors = new ArrayList<>();
    }
}

时空复杂度 O ( N + E ) O(N+E) O(N+E)。注意visited.add(neighbor);这句话的位置,在访问neighbor的同时应该立即将其加入visited,以防后面重复访问的浪费。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值