力扣算法学习day21-3

文章目录

  • 力扣算法学习day21-3
    • 332-重新安排行程
      • 题目
      • 代码实现

力扣算法学习day21-3

332-重新安排行程

题目

力扣算法学习day21-3_第1张图片

力扣算法学习day21-3_第2张图片

力扣算法学习day21-3_第3张图片

力扣算法学习day21-3_第4张图片

代码实现

class Solution {
    // 2h失败。纪念
    // List result = new ArrayList<>();
    // List> path = new ArrayList<>();
    // boolean[] used;
    // String pre = "";
    // String cur = "JFK";
    // public List findItinerary(List> tickets) {
    //     used = new boolean[tickets.size()];
    //     recall(0,tickets);

    //     return result;
    // }
    // public void recall(int j,List> tickets){
    //     if(path.size() == tickets.size()){
    //         result.add(path.get(0).get(0));
    //         for(List str : path){
    //             result.add(str.get(1));
    //         }
    //         return;
    //     }

    //     // 判断上一个票是否有起点相同且终点更小的目的地
    //     for(int i = j;i < tickets.size();i++){
    //         if(used[i]){
    //             continue;
    //         }
    //         List temp = tickets.get(i);
    //         if(temp.get(0).equals(pre)){
    //             if(compare(temp.get(1),cur)){
    //                 return;
    //             }
    //         }

    //     }

    //     for(int i = 0;i < tickets.size();i++){
    //         if(used[i]){// 这个票已经在路径上使用过了
    //             continue;
    //         }
    //         List temp = tickets.get(i);
    //         if(temp.get(0).equals(cur)){
    //             String tempPre = pre;
    //             String tempCur = cur;
    //             pre = temp.get(0);
    //             cur = temp.get(1);
    //             used[i] = true;
    //             path.add(temp);

    //             recall(i+1,tickets);// 递归

    //             pre = tempPre;
    //             cur = tempCur;
    //             used[i] = false;
    //             path.remove(path.size()-1);
    //         }
    //     }
    // }
    // public boolean compare(String temp,String cur){
    //     int sum1 = 0;
    //     int sum2 = 0;
    //     for(int i = 0;i < temp.length();i++){
    //         sum1 += temp.charAt(i);
    //         sum2 += cur.charAt(i);
    //     }
    //     if(sum1 > sum2){
    //         return false;
    //     } else {
    //         return true;
    //     }
    // }

    // 注:这里需要注意相同飞机票,即起点和终点相同的情况有多个的情况,
    //    故Map>类型不行。
    //   2.这是深度优先+回溯,只需要找一条边,不需要考虑去重。艹
    Map<String,Map<String,Integer>> map = new HashMap<>();
    public List<String> findItinerary(List<List<String>> tickets) {
        // 将起点终点之间的关系看成一个树的结点之间的关系,首先需要装结点
        for(List<String> list : tickets){
            if(map.containsKey(list.get(0))){
                Map<String,Integer> temp = map.get(list.get(0));
                if(temp.containsKey(list.get(1))){
                    temp.put(list.get(1),temp.get(list.get(1))+1);
                } else{
                    temp.put(list.get(1),1);
                }
            } else{
                Map<String,Integer> temp = new TreeMap<>();// 自带升序
                temp.put(list.get(1),1);
                map.put(list.get(0),temp);
            }
        }

        List<String> result = new ArrayList<>();
        result.add("JFK");// 初始起点固定。
        recall(tickets.size(),result);
        
        return result;
    }
    public boolean recall(int maxLength,List<String> result){
        if(result.size() == maxLength + 1){// 找到路径
            return true;
        }

        String str = result.get(result.size()-1);
        if(map.containsKey(str)){
            for(Map.Entry<String,Integer> temp : map.get(str).entrySet()){
                int value = temp.getValue();
                if(value > 0){
                    result.add(temp.getKey());
                    temp.setValue(value - 1);
                    if(recall(maxLength,result)){
                        return true;
                    }
                    temp.setValue(value);
                    result.remove(result.size()-1);
                }
            }
        }
        
        return false;
    }
}

你可能感兴趣的:(算法刷题,算法,leetcode)