-
Notifications
You must be signed in to change notification settings - Fork 1
/
[0827]332.重新安排行程.php
63 lines (48 loc) · 1.37 KB
/
[0827]332.重新安排行程.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
<?php
/*
* @lc app=leetcode.cn id=332 lang=php
*
* [332] 重新安排行程
*
* https://leetcode-cn.com/problems/reconstruct-itinerary/
* 视频讲解 https://www.bilibili.com/video/BV14J411h7W1?from=search&seid=1301487221452829034
*/
// @lc code=start
class Solution {
/**
* @param String[][] $tickets
* @return String[]
*/
function findItinerary($tickets) {
$g = [];
$this->buildGraph($tickets, $g); // 构建图
$stack = [];
$this->dfs($g, $stack, "JFK"); // 深度优先搜索
return array_reverse($stack);
}
function buildGraph($tickets, &$g) {
foreach ($tickets as $ticket) {
$from = $ticket[0];
$to = $ticket[1];
if (!array_key_exists($from, $g)) {
$g[$from] = [];
}
$g[$from][] = $to;
}
foreach ($g as $from => $tos) {
sort($g[$from]);
}
}
function dfs(&$g, &$stack, $from) {
while (!empty($g[$from])) {
$to = array_shift($g[$from]);
$this->dfs($g, $stack, $to); // 前一个目的地作为新的起点
}
array_push($stack, $from);
}
}
// Accepted
// 80/80 cases passed (32 ms)
// Your runtime beats 100 % of php submissions
// Your memory usage beats 100 % of php submissions (15.3 MB)
// @lc code=end