每日一题算法:2020年8月27日 [重新安排行程] findItinerary

2020年8月27日 重新安排行程 findItinerary

在这里插入图片描述

class Solution {
    public List<String> findItinerary(List<List<String>> tickets) {

    }
}

解题思路:

首先这个自然排序,实际上有一个非常简单的方法我学到过,就是直接使用hashcode,比如下面三个字符串的hashcode就可以直接看出排序。

在这里插入图片描述

在这里插入图片描述

知道这一点之后就是使用搜索算法了,使用有选择性的搜索算法,既不是广度也不是深度优先,而是自然排序最小优先。
在这里插入图片描述

    public List<String> findItinerary(List<List<String>> tickets) {

        //第一步,处理链表,使用HashMap来装载
        HashMap<String,List<String>> map=new HashMap<>();
        for (List<String> ticket : tickets) {
            if (map.get(ticket.get(0))==null){
                List<String> list=new ArrayList<>();
                list.add(ticket.get(1));
                map.put(ticket.get(0),list);
            }else
                map.get(ticket.get(0)).add(ticket.get(1));
        }
        LinkedList<String> res=new LinkedList<>();

        res.add("JFK");


        while (map.size()!=0){
            String last = res.getLast();

            List<String> list = map.get(last);
            if (list.size()==0)
                break;
            String min=list.get(0);
            int index=0;
            int i=0;
            for (String s : list) {
                if (s.hashCode()<min.hashCode()){
                    min=s;
                    index=i;
                }

                i++;
            }
            res.add(min);
            list.remove(index);
            if (list.size()==0)
                map.remove(last);

        }

        return res;
    }

题中有一些没有明白的,这次报错都帮我解决了,首先,最小和遍历所有行程相比,遍历所有行程是最重要的,最后得到的字符串链表长度一定是链表个数+1.

所以转变思路,由于需要使用递归的回溯算法,这道题使用深度优先来计算。

使用深度优先那么就先把这个链表转变为图来处理。

解题的思路就是使用深度优先+回溯算法来实现,具体的实现来不及了。。。

class Solution {
    Map<String, PriorityQueue<String>> map = new HashMap<String, PriorityQueue<String>>();
    List<String> itinerary = new LinkedList<String>();

    public List<String> findItinerary(List<List<String>> tickets) {
        for (List<String> ticket : tickets) {
            String src = ticket.get(0), dst = ticket.get(1);
            if (!map.containsKey(src)) {
                map.put(src, new PriorityQueue<String>());
            }
            map.get(src).offer(dst);
        }
        dfs("JFK");
        Collections.reverse(itinerary);
        return itinerary;
    }

    public void dfs(String curr) {
        while (map.containsKey(curr) && map.get(curr).size() > 0) {
            String tmp = map.get(curr).poll();
            dfs(tmp);
        }
        itinerary.add(curr);
    }
}

作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/reconstruct-itinerary/solution/zhong-xin-an-pai-xing-cheng-by-leetcode-solution/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值