Google算法题:仓鼠血缘

8 篇文章 0 订阅
5 篇文章 0 订阅

题目


如何找到两只仓鼠的血缘关系。没有预定义任何数据结构,只是让你写一个函数来做。有能力对问题进行建模,然后快速而高质量地编码


分析


(1)构造血缘图

(2)运用dfs,看能不能找到从仓鼠a到仓鼠b的路径,有则说明有血缘,无则说明无血缘


代码


package com.graph;

import java.util.*;

public class Solution{
	
	int n;
	Set<Integer> visited = new HashSet<Integer>();
	Map<Integer, Set<Integer>> map = new HashMap<Integer, Set<Integer>>();
	public boolean solve(int[][] relation, int a, int b){
	
		//Specail case
		if(relation==null || relation.length==0)
			return false;
		
		//Build the graph
		n = relation.length;
		for(int i=0; i<n; i++){
			//visited.put(map)
			int t1 = relation[i][0];
			int t2 = relation[i][1];
			
			if(!map.containsKey(t1))
				map.put(t1, new HashSet<Integer>());
			map.get(t1).add(t2);
			
			if(!map.containsKey(t2))
				map.put(t2, new HashSet<Integer>());
			map.get(t2).add(t1);
		}
		
		//check whether the graph contains a or b
		if(!map.containsKey(a) || !map.containsKey(b))
			return false;
		
		//dfs
		dfs(a, b);
		
		return find==1;
	}
	
	int find=0;
	void dfs(int v, int tar){
		if(v==tar){
			find=1;
			return;
		}
		Set<Integer> tmpSet = map.get(v);
		for(int tmp:tmpSet){
			if(!visited.contains(tmp)){
				visited.add(tmp);
				dfs(tmp, tar);
				if(find==1) return;
				visited.remove(tmp);
			}
		}
	}
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值