题目


思路:这道题和二叉树最近公共祖先类似
代码
class Solution {
public String findSmallestRegion(List<List<String>> regions, String region1, String region2) {
Map<String,String> map = new HashMap<>();
for(List<String> list : regions){
String ParentRegion = list.get(0);
for(int i = 1;i < list.size();i++){
//构建map,key是当前区域,value是最小父区域
map.put(list.get(i),ParentRegion);
}
}
List<String> res1 = find(region1,map);
List<String> res2 = find(region2,map);
for(String s : res1){
//因为父节点队列是有序的,排在前面的是最小的父节点,所以遍历返回的是最小的公共区域。
if(res2.contains(s)){
return s;
}
}
//因为保证最小公共区域一定存在,所以可以不把这个最大的公共区域加入父节点队列中,如果父节点队列中找不到公共区域,那结果就是regions.get(0).get(0)
// return regions.get(0).get(0);
return "";
}
public List<String> find(String region,Map<String,String> map){
List<String> res = new ArrayList<>();
//注意:这里需要把区域本身加进父节点list中,对应测试用例:"Canada","Quebec"
String parent = region;
while(map.get(parent)!=null){
res.add(parent);
parent = map.get(parent);
}
//这里是将最大的公共区域加进父节点list中
res.add(parent);
return res;
}
}
1512

被折叠的 条评论
为什么被折叠?



