leetcode第332题重新安排行程
思路:
- Map<String,Map<String,Map>> map = new Map<起始地,<目的地,机票的数量>>() 记录机票之间的映射关系
- 从JFK开始枚举,利用映射关系得到我要去的目的地和这张机票有几个,到了目的地之后,对应的机票减一,从结果的容器中在拿到起始地,减机票。
- 当我发现当前道路行不通的时候,remove已经加进去地点,从map里的map重新开始取出来,利用for循环,在找一遍合适的道路。
class Solution {
Map<String,Map<String,Integer>> map;
LinkedList<String> res;
public List<String> findItinerary(List<List<String>> tickets) {
//认真一点,应该是可以写出来了
map = new HashMap<>();
res = new LinkedList<>();
for(List<String> ticket : tickets){
Map<String,Integer> temp;
if(map.containsKey(ticket.get(0))){
temp = map.get(ticket.get(0));
//这里的设计真的很巧妙
temp.put(ticket.get(1),temp.getOrDefault(ticket.get(1),0) + 1);
}else{
temp = new TreeMap<>();
temp.put(ticket.get(1),1);
}
map.put(ticket.get(0),temp);
}
res.add("JFK");
backTrack(tickets.size());
return res;
}
boolean backTrack(int ticketsNum){
if(res.size() == ticketsNum + 1){
return true;
}
String last = res.getLast();
//防止出现空指针
if(map.containsKey(last)){
for(Map.Entry<String,Integer> helper : map.get(last).entrySet()){
int count = helper.getValue();
//如果对应的机票大于0
if(count > 0){
res.add(helper.getKey());
helper.setValue(count-1);
if(backTrack(ticketsNum)) return true;
res.removeLast();
helper.setValue(count);
}
}
}
return false;
}
}