力扣332題(重新安排行程)
阿新 • • 發佈:2022-02-23
332.重新安排行程
基本思想:
回溯
具體實現:
1.引數
Map<String, Map<String, Integer>> map 記錄航班的對映關係
ticketNum,表示有多少個航班(終止條件會用上)
2.遞迴終止條件
回溯遍歷的過程中,遇到的機場個數,如果達到了(航班數量+1)
程式碼:
class Solution { private Deque<String> res; private Map<String, Map<String, Integer>> map;//<出發機場, map<到達機場, 航班次數>>private boolean backTracking(int ticketNum){ if(res.size() == ticketNum + 1){ return true; } String last = res.getLast(); if(map.containsKey(last)){//防止出現null for(Map.Entry<String, Integer> target : map.get(last).entrySet()){int count = target.getValue(); if(count > 0){ res.add(target.getKey()); target.setValue(count - 1); if(backTracking(ticketNum)) return true; res.removeLast(); target.setValue(count); } } }return false; } public List<String> findItinerary(List<List<String>> tickets) { map = new HashMap<String, Map<String, Integer>>(); res = new LinkedList<>(); for(List<String> t : tickets){ Map<String, Integer> temp; if(map.containsKey(t.get(0))){//map中包含遍歷到的出發機場 temp = map.get(t.get(0));//該出發機場對應的<到達機場,航班次數>賦給temp temp.put(t.get(1), temp.getOrDefault(t.get(1), 0) + 1); //修改temp<到達機場,航班次數> }else{ temp = new TreeMap<>();//升序Map temp.put(t.get(1), 1); } map.put(t.get(0), temp); } res.add("JFK"); backTracking(tickets.size()); return new ArrayList<>(res); } }