1. 程式人生 > 其它 >力扣332題(重新安排行程)

力扣332題(重新安排行程)

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); } }