-
Notifications
You must be signed in to change notification settings - Fork 0
/
1043.swift
94 lines (85 loc) · 2.65 KB
/
1043.swift
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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
import Foundation
func readList() -> [Int] {
return readLine()!.split(separator: " ").map {Int(String($0))!}
}
struct Range {
let left, right: Int
func isValid() -> Bool {
return left <= right
}
}
var num = readList()[0]
var preOrder = readList()
var roots = [Int]()
func isValidBST(_ range: Range) -> Bool {
// print(roots, range.left, range.right)
var result = true
if range.isValid() {
let root = preOrder[range.left]
let subRange = Range(left: range.left + 1, right: range.right)
if subRange.isValid() {
var mark = subRange.right + 1
for i in subRange.left...subRange.right {
if preOrder[i] >= root {
mark = i
break
}
}
let leftRange = Range(left: subRange.left, right: mark - 1)
let rightRange = Range(left: mark, right: subRange.right)
if rightRange.isValid() {
for i in rightRange.left...rightRange.right {
if preOrder[i] < root {
result = false
}
}
}
result = result && isValidBST(leftRange) && isValidBST(rightRange)
}
roots.append(root)
}
return result
}
func isValidBSTMirror(_ range: Range) -> Bool {
// print(roots, range.left, range.right)
var result = true
if range.isValid() {
let root = preOrder[range.left]
let subRange = Range(left: range.left + 1, right: range.right)
if subRange.isValid() {
var mark = subRange.right + 1
for i in subRange.left...subRange.right {
if preOrder[i] < root {
mark = i
break
}
}
let leftRange = Range(left: subRange.left, right: mark - 1)
let rightRange = Range(left: mark, right: subRange.right)
if rightRange.isValid() {
for i in rightRange.left...rightRange.right {
if preOrder[i] >= root {
result = false
}
}
}
result = result && isValidBSTMirror(leftRange) && isValidBSTMirror(rightRange)
}
roots.append(root)
}
return result
}
let range = Range(left: 0, right: preOrder.count - 1)
if isValidBST(range) {
print("YES")
print(roots.map{String($0)}.joined(separator: " "))
} else {
roots.removeAll()
// print("MARK")
if isValidBSTMirror(range) {
print("YES")
print(roots.map{String($0)}.joined(separator: " "))
} else {
print("NO")
}
}