leetcode reconstruct-itinerary

题目链接

这个题目虽然是用的深度优先算法。其实并不是经典的深度优先。首先这个题的深度优先遍历有顺序。必须是字典序从小到大的。所以用了sortedMap这个数据结构。其次。深度优先遍历如果一个点已经使用过,那么这个点第二次遍历就不能再使用。不过这里是可以在使用的。所以就需要使用每个边进行标记。如果这个边已经使用那就不能在使用,所以便有了这个数据结构sortedMap

import java.util.Arrays;
import java.util.Comparator;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.PriorityQueue;
import java.util.Set;
import java.util.SortedMap;
import java.util.TreeMap;

public class Solution {

    public static void main(String args[])
    {
        Solution solution=new Solution();
        solution.findItinerary(new String [][]{{"MUC","LHR"},{"JFK","MUC"},{"SFO","SJC"},{"LHR","SFO"}});


    }

    HashMap<String, SortedMap<String,Integer>> map=new HashMap<String, SortedMap<String,Integer>>();
    LinkedList<String> result=new LinkedList<String>();
    int n;
    public List<String> findItinerary(String[][] tickets) {
        n=tickets.length;

        for(int i=0;i<tickets.length;i++)
        {
            SortedMap<String,Integer> theGet=map.get(tickets[i][0]);
            if(theGet==null)
            {
                theGet=new TreeMap<String,Integer>();
                map.put(tickets[i][0], theGet);
            }

            Integer count=theGet.get(tickets[i][1]);
            if(count==null)
            {
                theGet.put(tickets[i][1], 1);
            }
            else
            {
                theGet.put(tickets[i][1],count+1);
            }
        }


        String current="JFK";
        result.add(current);
        help(current);
        return result;

    }

    boolean help(String current)
    {
        if(result.size()==n+1)
        {
            return true;
        }

        SortedMap<String,Integer> theGet=map.get(current);
        if(theGet!=null)
        {
            Set<String> keys = theGet.keySet();
            for (String key : keys){
                if(theGet.get(key)!=0)
                {
                    theGet.put(key, theGet.get(key)-1);
                    result.add(key);
                    if(help(key))return true;
                    result.pollLast();
                    theGet.put(key, theGet.get(key)+1);
                }
            }
        }
        return false;

    }


}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值