332-重新安排行程
时间: 2023-10-24 12:10:00 浏览: 168
思路:
1. 先建立一个图,用邻接表表示。遍历tickets数组,以出发城市为键,以到达城市为值,将所有相同出发城市的到达城市加入到对应的键的值列表。
2. 对每个出发城市的到达城市列表进行排序,保证按字母顺序进行访问。
3. 从"JFK"出发,进行深度优先遍历。如果当前城市的到达城市列表不为空,则按顺序访问列表中的城市,并将访问过的城市从列表中删除。
4. 如果当前城市没有到达城市或者到达城市已经全部被访问过了,则将当前城市加入结果列表的头部。
5. 最后得到的结果列表,逆序输出即可得到答案。
代码实现如下:
```python
from collections import defaultdict
def findItinerary(tickets):
# 用于保存图
graph = defaultdict(list)
# 将tickets中的数据存入图
for ticket in tickets:
src, dst = ticket
graph[src].append(dst)
# 按照字母顺序对到达城市进行排序
for src in graph:
graph[src].sort()
def dfs(city):
# 当前城市的到达城市列表
destinations = graph[city]
while destinations:
# 递归遍历下一个城市
dfs(destinations.pop(0))
# 将当前城市加入结果列表
result.insert(0, city)
# 结果列表
result = []
dfs("JFK")
return result
# 测试
tickets = [["MUC","LHR"],["JFK","MUC"],["SFO","SJC"],["LHR","SFO"]]
print(findItinerary(tickets))
# 输出:['JFK', 'MUC', 'LHR', 'SFO', 'SJC']
```
复杂度分析:
- 时间复杂度:建立图的过程需要遍历tickets数组,时间复杂度为O(n),其中n为数组的长度。遍历图的过程中,所有的边都会被访问一次,时间复杂度为O(m),其中m为图中的边数。因此,总的时间复杂度为O(n+m)。
- 空间复杂度:使用了一个字典来保存图,空间复杂度为O(m),其中m为图中的边数。递归调用的深度为图中的边数+1,空间复杂度为O(m+1)。最后返回的结果列表的空间复杂度为O(n),其中n为结果列表的长度。因此,总的空间复杂度为O(m+n)。
阅读全文