diff --git "a/problems/0332.\351\207\215\346\226\260\345\256\211\346\216\222\350\241\214\347\250\213.md" "b/problems/0332.\351\207\215\346\226\260\345\256\211\346\216\222\350\241\214\347\250\213.md" index fcdb6a33ed..33d75f679c 100644 --- "a/problems/0332.\351\207\215\346\226\260\345\256\211\346\216\222\350\241\214\347\250\213.md" +++ "b/problems/0332.\351\207\215\346\226\260\345\256\211\346\216\222\350\241\214\347\250\213.md" @@ -477,59 +477,69 @@ class Solution: ### Go ```go -type pair struct { - target string - visited bool +type SortedMap struct { + toes []string // 有序键序列 + values map[string]int // 实际键值对 } -type pairs []*pair -func (p pairs) Len() int { - return len(p) +func NewSortedMap() *SortedMap { + return &SortedMap{ + toes: []string{}, + values: make(map[string]int), + } } -func (p pairs) Swap(i, j int) { - p[i], p[j] = p[j], p[i] + +func (s *SortedMap) Set(to string) { + if _, ok := s.values[to]; !ok { + s.toes = append(s.toes, to) + } + s.values[to]++ } -func (p pairs) Less(i, j int) bool { - return p[i].target < p[j].target + +func (s *SortedMap) Sort() { + sort.Sort(sort.StringSlice(s.toes)) + return } func findItinerary(tickets [][]string) []string { - result := []string{} - // map[出发机场] pair{目的地,是否被访问过} - targets := make(map[string]pairs) - for _, ticket := range tickets { - if targets[ticket[0]] == nil { - targets[ticket[0]] = make(pairs, 0) + + targetsMap := make(map[string]*SortedMap) + for _, pair := range tickets { + from, to := pair[0], pair[1] + if _, ok := targetsMap[from]; !ok { + targetsMap[from] = NewSortedMap() } - targets[ticket[0]] = append(targets[ticket[0]], &pair{target: ticket[1], visited: false}) + targetsMap[from].Set(to) } - for k, _ := range targets { - sort.Sort(targets[k]) + for k, _ := range targetsMap { + targetsMap[k].Sort() } - result = append(result, "JFK") - var backtracking func() bool - backtracking = func() bool { - if len(tickets)+1 == len(result) { + + res := []string{"JFK"} + var bt func() bool + bt = func() bool { + if len(res) == len(tickets)+1 { return true } - // 取出起飞航班对应的目的地 - for _, pair := range targets[result[len(result)-1]] { - if pair.visited == false { - result = append(result, pair.target) - pair.visited = true - if backtracking() { - return true + start := res[len(res)-1] + destinations := targetsMap[start] + if destinations != nil { + for _, to := range destinations.toes { + if destinations.values[to] > 0 { + destinations.values[to]-- + res = append(res, to) + if bt() { + return true + } + res = res[:len(res)-1] + destinations.values[to]++ } - result = result[:len(result)-1] - pair.visited = false } } return false } - - backtracking() - - return result + bt() + return res } ```