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)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。