《LeetCode力扣练习》代码随想录——回溯算法(重新安排行程—Java)
刷题思路来源于 代码随想录
332. 重新安排行程
-
回溯
class Solution { private boolean[] used; private List<String> result = new ArrayList<>(); public List<String> findItinerary(List<List<String>> tickets) { used = new boolean[tickets.size()]; Collections.sort(tickets, (o1, o2) -> (o1.get(1).compareTo(o2.get(1)) == 0 ? o1.get(0).compareTo(o2.get(0)) : o1.get(1).compareTo(o2.get(1)))); result.add("JFK"); backtrack(tickets, tickets.size() + 1); return result; } private boolean backtrack(List<List<String>> tickets, int num) { if (result.size() == num) { return true; } for (int i = 0; i < tickets.size(); i++) { if (i > 0 && used[i - 1] == false && tickets.get(i).get(0).equals(tickets.get(i - 1).get(0)) && tickets.get(i).get(1).equals(tickets.get(i - 1).get(1))) { continue; } if (used[i] == false && result.get(result.size() - 1).equals(tickets.get(i).get(0))) { used[i] = true; result.add(tickets.get(i).get(1)); if (backtrack(tickets, num)) { return true; } used[i] = false; result.remove(result.size() - 1); } } return false; } }