Skip to content

Commit 2ad5648

Browse files
klever34yanglbme
andauthored
feat: add swift implementation to lcof2 problem: No.057 (doocs#3100)
--------- Co-authored-by: Libin YANG <[email protected]>
1 parent 8db1bf4 commit 2ad5648

File tree

2 files changed

+343
-0
lines changed

2 files changed

+343
-0
lines changed

lcof2/剑指 Offer II 057. 值和下标之差都在给定的范围内/README.md

Lines changed: 174 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -809,6 +809,180 @@ class TreeMultiSet<T = number> {
809809
}
810810
```
811811

812+
#### Swift
813+
814+
```swift
815+
class Solution {
816+
func containsNearbyAlmostDuplicate(_ nums: [Int], _ k: Int, _ t: Int) -> Bool {
817+
guard nums.count > 1, k > 0, t >= 0 else { return false }
818+
819+
var ts = TreeSet<Int64>()
820+
for i in 0..<nums.count {
821+
let num = Int64(nums[i])
822+
if let x = ts.ceiling(num - Int64(t)), abs(x - num) <= Int64(t) {
823+
return true
824+
}
825+
ts.insert(num)
826+
if i >= k {
827+
ts.remove(Int64(nums[i - k]))
828+
}
829+
}
830+
return false
831+
}
832+
}
833+
834+
class AVLTreeNode<T: Comparable> {
835+
var value: T
836+
var height: Int
837+
var left: AVLTreeNode?
838+
var right: AVLTreeNode?
839+
840+
init(value: T) {
841+
self.value = value
842+
self.height = 1
843+
}
844+
}
845+
846+
class TreeSet<T: Comparable> {
847+
private var root: AVLTreeNode<T>?
848+
849+
func insert(_ value: T) {
850+
root = insert(root, value)
851+
}
852+
853+
func remove(_ value: T) {
854+
root = remove(root, value)
855+
}
856+
857+
func ceiling(_ value: T) -> T? {
858+
return ceiling(root, value)
859+
}
860+
861+
private func insert(_ node: AVLTreeNode<T>?, _ value: T) -> AVLTreeNode<T> {
862+
guard let node = node else {
863+
return AVLTreeNode(value: value)
864+
}
865+
866+
if value < node.value {
867+
node.left = insert(node.left, value)
868+
} else if value > node.value {
869+
node.right = insert(node.right, value)
870+
} else {
871+
return node
872+
}
873+
874+
return balance(node)
875+
}
876+
877+
private func remove(_ node: AVLTreeNode<T>?, _ value: T) -> AVLTreeNode<T>? {
878+
guard let node = node else {
879+
return nil
880+
}
881+
882+
if value < node.value {
883+
node.left = remove(node.left, value)
884+
} else if value > node.value {
885+
node.right = remove(node.right, value)
886+
} else {
887+
if node.left == nil {
888+
return node.right
889+
} else if node.right == nil {
890+
return node.left
891+
} else {
892+
if let minLargerNode = minNode(node.right) {
893+
node.value = minLargerNode.value
894+
node.right = remove(node.right, minLargerNode.value)
895+
}
896+
}
897+
}
898+
899+
return balance(node)
900+
}
901+
902+
private func ceiling(_ node: AVLTreeNode<T>?, _ value: T) -> T? {
903+
guard let node = node else {
904+
return nil
905+
}
906+
907+
if node.value == value {
908+
return node.value
909+
} else if node.value < value {
910+
return ceiling(node.right, value)
911+
} else {
912+
return ceiling(node.left, value) ?? node.value
913+
}
914+
}
915+
916+
private func height(_ node: AVLTreeNode<T>?) -> Int {
917+
return node?.height ?? 0
918+
}
919+
920+
private func balanceFactor(_ node: AVLTreeNode<T>) -> Int {
921+
return height(node.left) - height(node.right)
922+
}
923+
924+
private func updateHeight(_ node: AVLTreeNode<T>) {
925+
node.height = 1 + max(height(node.left), height(node.right))
926+
}
927+
928+
private func rotateRight(_ y: AVLTreeNode<T>) -> AVLTreeNode<T> {
929+
let x = y.left!
930+
let T2 = x.right
931+
932+
x.right = y
933+
y.left = T2
934+
935+
updateHeight(y)
936+
updateHeight(x)
937+
938+
return x
939+
}
940+
941+
private func rotateLeft(_ x: AVLTreeNode<T>) -> AVLTreeNode<T> {
942+
let y = x.right!
943+
let T2 = y.left
944+
945+
y.left = x
946+
x.right = T2
947+
948+
updateHeight(x)
949+
updateHeight(y)
950+
951+
return y
952+
}
953+
954+
private func balance(_ node: AVLTreeNode<T>) -> AVLTreeNode<T> {
955+
updateHeight(node)
956+
957+
let balance = balanceFactor(node)
958+
959+
if balance > 1 {
960+
if balanceFactor(node.left!) < 0 {
961+
node.left = rotateLeft(node.left!)
962+
}
963+
return rotateRight(node)
964+
}
965+
966+
if balance < -1 {
967+
if balanceFactor(node.right!) > 0 {
968+
node.right = rotateRight(node.right!)
969+
}
970+
return rotateLeft(node)
971+
}
972+
973+
return node
974+
}
975+
976+
private func minNode(_ node: AVLTreeNode<T>?) -> AVLTreeNode<T>? {
977+
var current = node
978+
while current?.left != nil {
979+
current = current?.left
980+
}
981+
return current
982+
}
983+
}
984+
```
985+
812986
<!-- tabs:end -->
813987

814988
<!-- solution:end -->
Lines changed: 169 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,169 @@
1+
class Solution {
2+
func containsNearbyAlmostDuplicate(_ nums: [Int], _ k: Int, _ t: Int) -> Bool {
3+
guard nums.count > 1, k > 0, t >= 0 else { return false }
4+
5+
var ts = TreeSet<Int64>()
6+
for i in 0..<nums.count {
7+
let num = Int64(nums[i])
8+
if let x = ts.ceiling(num - Int64(t)), abs(x - num) <= Int64(t) {
9+
return true
10+
}
11+
ts.insert(num)
12+
if i >= k {
13+
ts.remove(Int64(nums[i - k]))
14+
}
15+
}
16+
return false
17+
}
18+
}
19+
20+
class AVLTreeNode<T: Comparable> {
21+
var value: T
22+
var height: Int
23+
var left: AVLTreeNode?
24+
var right: AVLTreeNode?
25+
26+
init(value: T) {
27+
self.value = value
28+
self.height = 1
29+
}
30+
}
31+
32+
class TreeSet<T: Comparable> {
33+
private var root: AVLTreeNode<T>?
34+
35+
func insert(_ value: T) {
36+
root = insert(root, value)
37+
}
38+
39+
func remove(_ value: T) {
40+
root = remove(root, value)
41+
}
42+
43+
func ceiling(_ value: T) -> T? {
44+
return ceiling(root, value)
45+
}
46+
47+
private func insert(_ node: AVLTreeNode<T>?, _ value: T) -> AVLTreeNode<T> {
48+
guard let node = node else {
49+
return AVLTreeNode(value: value)
50+
}
51+
52+
if value < node.value {
53+
node.left = insert(node.left, value)
54+
} else if value > node.value {
55+
node.right = insert(node.right, value)
56+
} else {
57+
return node
58+
}
59+
60+
return balance(node)
61+
}
62+
63+
private func remove(_ node: AVLTreeNode<T>?, _ value: T) -> AVLTreeNode<T>? {
64+
guard let node = node else {
65+
return nil
66+
}
67+
68+
if value < node.value {
69+
node.left = remove(node.left, value)
70+
} else if value > node.value {
71+
node.right = remove(node.right, value)
72+
} else {
73+
if node.left == nil {
74+
return node.right
75+
} else if node.right == nil {
76+
return node.left
77+
} else {
78+
if let minLargerNode = minNode(node.right) {
79+
node.value = minLargerNode.value
80+
node.right = remove(node.right, minLargerNode.value)
81+
}
82+
}
83+
}
84+
85+
return balance(node)
86+
}
87+
88+
private func ceiling(_ node: AVLTreeNode<T>?, _ value: T) -> T? {
89+
guard let node = node else {
90+
return nil
91+
}
92+
93+
if node.value == value {
94+
return node.value
95+
} else if node.value < value {
96+
return ceiling(node.right, value)
97+
} else {
98+
return ceiling(node.left, value) ?? node.value
99+
}
100+
}
101+
102+
private func height(_ node: AVLTreeNode<T>?) -> Int {
103+
return node?.height ?? 0
104+
}
105+
106+
private func balanceFactor(_ node: AVLTreeNode<T>) -> Int {
107+
return height(node.left) - height(node.right)
108+
}
109+
110+
private func updateHeight(_ node: AVLTreeNode<T>) {
111+
node.height = 1 + max(height(node.left), height(node.right))
112+
}
113+
114+
private func rotateRight(_ y: AVLTreeNode<T>) -> AVLTreeNode<T> {
115+
let x = y.left!
116+
let T2 = x.right
117+
118+
x.right = y
119+
y.left = T2
120+
121+
updateHeight(y)
122+
updateHeight(x)
123+
124+
return x
125+
}
126+
127+
private func rotateLeft(_ x: AVLTreeNode<T>) -> AVLTreeNode<T> {
128+
let y = x.right!
129+
let T2 = y.left
130+
131+
y.left = x
132+
x.right = T2
133+
134+
updateHeight(x)
135+
updateHeight(y)
136+
137+
return y
138+
}
139+
140+
private func balance(_ node: AVLTreeNode<T>) -> AVLTreeNode<T> {
141+
updateHeight(node)
142+
143+
let balance = balanceFactor(node)
144+
145+
if balance > 1 {
146+
if balanceFactor(node.left!) < 0 {
147+
node.left = rotateLeft(node.left!)
148+
}
149+
return rotateRight(node)
150+
}
151+
152+
if balance < -1 {
153+
if balanceFactor(node.right!) > 0 {
154+
node.right = rotateRight(node.right!)
155+
}
156+
return rotateLeft(node)
157+
}
158+
159+
return node
160+
}
161+
162+
private func minNode(_ node: AVLTreeNode<T>?) -> AVLTreeNode<T>? {
163+
var current = node
164+
while current?.left != nil {
165+
current = current?.left
166+
}
167+
return current
168+
}
169+
}

0 commit comments

Comments
 (0)