From c44ab95d8bfa252761b9c8d26f8def3562df83c3 Mon Sep 17 00:00:00 2001 From: Lanre Adedara Date: Thu, 13 Jun 2024 16:09:26 +0100 Subject: [PATCH 1/7] feat: add swift implementation to lcof2 problem: No.057 --- .../README.md" | 47 +++++++++++++++++++ .../Solution.swift" | 42 +++++++++++++++++ 2 files changed, 89 insertions(+) create mode 100644 "lcof2/\345\211\221\346\214\207 Offer II 057. \345\200\274\345\222\214\344\270\213\346\240\207\344\271\213\345\267\256\351\203\275\345\234\250\347\273\231\345\256\232\347\232\204\350\214\203\345\233\264\345\206\205/Solution.swift" diff --git "a/lcof2/\345\211\221\346\214\207 Offer II 057. \345\200\274\345\222\214\344\270\213\346\240\207\344\271\213\345\267\256\351\203\275\345\234\250\347\273\231\345\256\232\347\232\204\350\214\203\345\233\264\345\206\205/README.md" "b/lcof2/\345\211\221\346\214\207 Offer II 057. \345\200\274\345\222\214\344\270\213\346\240\207\344\271\213\345\267\256\351\203\275\345\234\250\347\273\231\345\256\232\347\232\204\350\214\203\345\233\264\345\206\205/README.md" index 74f1f0511ac5d..8b2bf237ce05d 100644 --- "a/lcof2/\345\211\221\346\214\207 Offer II 057. \345\200\274\345\222\214\344\270\213\346\240\207\344\271\213\345\267\256\351\203\275\345\234\250\347\273\231\345\256\232\347\232\204\350\214\203\345\233\264\345\206\205/README.md" +++ "b/lcof2/\345\211\221\346\214\207 Offer II 057. \345\200\274\345\222\214\344\270\213\346\240\207\344\271\213\345\267\256\351\203\275\345\234\250\347\273\231\345\256\232\347\232\204\350\214\203\345\233\264\345\206\205/README.md" @@ -809,6 +809,53 @@ class TreeMultiSet { } ``` +#### Swift + +```swift +class Solution { + func containsNearbyAlmostDuplicate(_ nums: [Int], _ k: Int, _ t: Int) -> Bool { + guard nums.count > 1, k > 0, t >= 0 else { return false } + + var ts = SortedSet() + for i in 0..= k { + ts.remove(Int64(nums[i - k])) + } + } + return false + } +} + +struct SortedSet { + private var elements = [Element]() + + mutating func insert(_ value: Element) { + elements.append(value) + elements.sort() + } + + mutating func remove(_ value: Element) { + if let index = elements.firstIndex(of: value) { + elements.remove(at: index) + } + } + + func ceiling(_ value: Element) -> Element? { + for element in elements { + if element >= value { + return element + } + } + return nil + } +} +``` + diff --git "a/lcof2/\345\211\221\346\214\207 Offer II 057. \345\200\274\345\222\214\344\270\213\346\240\207\344\271\213\345\267\256\351\203\275\345\234\250\347\273\231\345\256\232\347\232\204\350\214\203\345\233\264\345\206\205/Solution.swift" "b/lcof2/\345\211\221\346\214\207 Offer II 057. \345\200\274\345\222\214\344\270\213\346\240\207\344\271\213\345\267\256\351\203\275\345\234\250\347\273\231\345\256\232\347\232\204\350\214\203\345\233\264\345\206\205/Solution.swift" new file mode 100644 index 0000000000000..5acbd31a51972 --- /dev/null +++ "b/lcof2/\345\211\221\346\214\207 Offer II 057. \345\200\274\345\222\214\344\270\213\346\240\207\344\271\213\345\267\256\351\203\275\345\234\250\347\273\231\345\256\232\347\232\204\350\214\203\345\233\264\345\206\205/Solution.swift" @@ -0,0 +1,42 @@ +class Solution { + func containsNearbyAlmostDuplicate(_ nums: [Int], _ k: Int, _ t: Int) -> Bool { + guard nums.count > 1, k > 0, t >= 0 else { return false } + + var ts = SortedSet() + for i in 0..= k { + ts.remove(Int64(nums[i - k])) + } + } + return false + } +} + +struct SortedSet { + private var elements = [Element]() + + mutating func insert(_ value: Element) { + elements.append(value) + elements.sort() + } + + mutating func remove(_ value: Element) { + if let index = elements.firstIndex(of: value) { + elements.remove(at: index) + } + } + + func ceiling(_ value: Element) -> Element? { + for element in elements { + if element >= value { + return element + } + } + return nil + } +} \ No newline at end of file From 00faf1a325c3d3c20e891aacf4573997eebf7f0c Mon Sep 17 00:00:00 2001 From: Lanre Adedara Date: Thu, 13 Jun 2024 16:25:40 +0100 Subject: [PATCH 2/7] feat: add swift implementation to lcof2 problem: No.058 --- .../README.md" | 33 +++++++++++++++++++ .../Solution.swift" | 27 +++++++++++++++ 2 files changed, 60 insertions(+) create mode 100644 "lcof2/\345\211\221\346\214\207 Offer II 058. \346\227\245\347\250\213\350\241\250/Solution.swift" diff --git "a/lcof2/\345\211\221\346\214\207 Offer II 058. \346\227\245\347\250\213\350\241\250/README.md" "b/lcof2/\345\211\221\346\214\207 Offer II 058. \346\227\245\347\250\213\350\241\250/README.md" index 44344ad0365b6..dd0a74e787720 100644 --- "a/lcof2/\345\211\221\346\214\207 Offer II 058. \346\227\245\347\250\213\350\241\250/README.md" +++ "b/lcof2/\345\211\221\346\214\207 Offer II 058. \346\227\245\347\250\213\350\241\250/README.md" @@ -150,6 +150,39 @@ func (this *MyCalendar) Book(start int, end int) bool { */ ``` +#### Swift + +```swift +class MyCalendar { + + private var calendar: [(Int, Int)] + + init() { + self.calendar = [] + } + + func book(_ start: Int, _ end: Int) -> Bool { + let newEvent = (start, end) + let index = calendar.firstIndex { $0.0 >= newEvent.1 } ?? calendar.count + + if index > 0 && calendar[index - 1].1 > newEvent.0 { + return false + } + + calendar.insert(newEvent, at: index) + return true + } +} + +/** + * Your MyCalendar object will be instantiated and called as such: + * let obj = MyCalendar() + * let ret = obj.book(start, end) + */ + + +``` + diff --git "a/lcof2/\345\211\221\346\214\207 Offer II 058. \346\227\245\347\250\213\350\241\250/Solution.swift" "b/lcof2/\345\211\221\346\214\207 Offer II 058. \346\227\245\347\250\213\350\241\250/Solution.swift" new file mode 100644 index 0000000000000..08ba6a86d47bf --- /dev/null +++ "b/lcof2/\345\211\221\346\214\207 Offer II 058. \346\227\245\347\250\213\350\241\250/Solution.swift" @@ -0,0 +1,27 @@ +class MyCalendar { + + private var calendar: [(Int, Int)] + + init() { + self.calendar = [] + } + + func book(_ start: Int, _ end: Int) -> Bool { + let newEvent = (start, end) + let index = calendar.firstIndex { $0.0 >= newEvent.1 } ?? calendar.count + + if index > 0 && calendar[index - 1].1 > newEvent.0 { + return false + } + + calendar.insert(newEvent, at: index) + return true + } +} + +/** + * Your MyCalendar object will be instantiated and called as such: + * let obj = MyCalendar() + * let ret = obj.book(start, end) + */ + From 0bd63adaef42db2ee37cf435f9afca93745946b5 Mon Sep 17 00:00:00 2001 From: Lanre Adedara Date: Thu, 13 Jun 2024 16:26:57 +0100 Subject: [PATCH 3/7] feat: add swift implementation to lcof2 problem: No.057 --- .../README.md" | 33 ------------------- .../Solution.swift" | 27 --------------- 2 files changed, 60 deletions(-) delete mode 100644 "lcof2/\345\211\221\346\214\207 Offer II 058. \346\227\245\347\250\213\350\241\250/Solution.swift" diff --git "a/lcof2/\345\211\221\346\214\207 Offer II 058. \346\227\245\347\250\213\350\241\250/README.md" "b/lcof2/\345\211\221\346\214\207 Offer II 058. \346\227\245\347\250\213\350\241\250/README.md" index dd0a74e787720..44344ad0365b6 100644 --- "a/lcof2/\345\211\221\346\214\207 Offer II 058. \346\227\245\347\250\213\350\241\250/README.md" +++ "b/lcof2/\345\211\221\346\214\207 Offer II 058. \346\227\245\347\250\213\350\241\250/README.md" @@ -150,39 +150,6 @@ func (this *MyCalendar) Book(start int, end int) bool { */ ``` -#### Swift - -```swift -class MyCalendar { - - private var calendar: [(Int, Int)] - - init() { - self.calendar = [] - } - - func book(_ start: Int, _ end: Int) -> Bool { - let newEvent = (start, end) - let index = calendar.firstIndex { $0.0 >= newEvent.1 } ?? calendar.count - - if index > 0 && calendar[index - 1].1 > newEvent.0 { - return false - } - - calendar.insert(newEvent, at: index) - return true - } -} - -/** - * Your MyCalendar object will be instantiated and called as such: - * let obj = MyCalendar() - * let ret = obj.book(start, end) - */ - - -``` - diff --git "a/lcof2/\345\211\221\346\214\207 Offer II 058. \346\227\245\347\250\213\350\241\250/Solution.swift" "b/lcof2/\345\211\221\346\214\207 Offer II 058. \346\227\245\347\250\213\350\241\250/Solution.swift" deleted file mode 100644 index 08ba6a86d47bf..0000000000000 --- "a/lcof2/\345\211\221\346\214\207 Offer II 058. \346\227\245\347\250\213\350\241\250/Solution.swift" +++ /dev/null @@ -1,27 +0,0 @@ -class MyCalendar { - - private var calendar: [(Int, Int)] - - init() { - self.calendar = [] - } - - func book(_ start: Int, _ end: Int) -> Bool { - let newEvent = (start, end) - let index = calendar.firstIndex { $0.0 >= newEvent.1 } ?? calendar.count - - if index > 0 && calendar[index - 1].1 > newEvent.0 { - return false - } - - calendar.insert(newEvent, at: index) - return true - } -} - -/** - * Your MyCalendar object will be instantiated and called as such: - * let obj = MyCalendar() - * let ret = obj.book(start, end) - */ - From 66a9d8a2302b1ef7b9aa1ef1b1d7000384fd8d8f Mon Sep 17 00:00:00 2001 From: Lanre Adedara Date: Fri, 14 Jun 2024 07:58:01 +0100 Subject: [PATCH 4/7] feat: add swift implementation to lcof2 problem: No.057 --- .../README.md" | 48 +++++++++++-------- .../Solution.swift" | 46 ++++++++++-------- 2 files changed, 55 insertions(+), 39 deletions(-) diff --git "a/lcof2/\345\211\221\346\214\207 Offer II 057. \345\200\274\345\222\214\344\270\213\346\240\207\344\271\213\345\267\256\351\203\275\345\234\250\347\273\231\345\256\232\347\232\204\350\214\203\345\233\264\345\206\205/README.md" "b/lcof2/\345\211\221\346\214\207 Offer II 057. \345\200\274\345\222\214\344\270\213\346\240\207\344\271\213\345\267\256\351\203\275\345\234\250\347\273\231\345\256\232\347\232\204\350\214\203\345\233\264\345\206\205/README.md" index 8b2bf237ce05d..d93b6f75d37a6 100644 --- "a/lcof2/\345\211\221\346\214\207 Offer II 057. \345\200\274\345\222\214\344\270\213\346\240\207\344\271\213\345\267\256\351\203\275\345\234\250\347\273\231\345\256\232\347\232\204\350\214\203\345\233\264\345\206\205/README.md" +++ "b/lcof2/\345\211\221\346\214\207 Offer II 057. \345\200\274\345\222\214\344\270\213\346\240\207\344\271\213\345\267\256\351\203\275\345\234\250\347\273\231\345\256\232\347\232\204\350\214\203\345\233\264\345\206\205/README.md" @@ -816,39 +816,47 @@ class Solution { func containsNearbyAlmostDuplicate(_ nums: [Int], _ k: Int, _ t: Int) -> Bool { guard nums.count > 1, k > 0, t >= 0 else { return false } - var ts = SortedSet() + var ts = SortedDictionary() for i in 0..= k { - ts.remove(Int64(nums[i - k])) + ts.removeValue(forKey: Int64(nums[i - k])) } } return false } } -struct SortedSet { - private var elements = [Element]() - - mutating func insert(_ value: Element) { - elements.append(value) - elements.sort() - } - - mutating func remove(_ value: Element) { - if let index = elements.firstIndex(of: value) { - elements.remove(at: index) +public struct SortedDictionary { + private var keys = [Key]() + private var values = [Key: Value]() + + public var isEmpty: Bool { + return keys.isEmpty + } + + public mutating func updateValue(_ value: Value, forKey key: Key) { + if values[key] == nil { + keys.append(key) + keys.sort() } + values[key] = value } - - func ceiling(_ value: Element) -> Element? { - for element in elements { - if element >= value { - return element + + public mutating func removeValue(forKey key: Key) { + if values.removeValue(forKey: key) != nil { + keys.removeAll { $0 == key } + } + } + + public func ceilingKey(_ key: Key) -> Key? { + for k in keys { + if k >= key { + return k } } return nil diff --git "a/lcof2/\345\211\221\346\214\207 Offer II 057. \345\200\274\345\222\214\344\270\213\346\240\207\344\271\213\345\267\256\351\203\275\345\234\250\347\273\231\345\256\232\347\232\204\350\214\203\345\233\264\345\206\205/Solution.swift" "b/lcof2/\345\211\221\346\214\207 Offer II 057. \345\200\274\345\222\214\344\270\213\346\240\207\344\271\213\345\267\256\351\203\275\345\234\250\347\273\231\345\256\232\347\232\204\350\214\203\345\233\264\345\206\205/Solution.swift" index 5acbd31a51972..6b7f331987e78 100644 --- "a/lcof2/\345\211\221\346\214\207 Offer II 057. \345\200\274\345\222\214\344\270\213\346\240\207\344\271\213\345\267\256\351\203\275\345\234\250\347\273\231\345\256\232\347\232\204\350\214\203\345\233\264\345\206\205/Solution.swift" +++ "b/lcof2/\345\211\221\346\214\207 Offer II 057. \345\200\274\345\222\214\344\270\213\346\240\207\344\271\213\345\267\256\351\203\275\345\234\250\347\273\231\345\256\232\347\232\204\350\214\203\345\233\264\345\206\205/Solution.swift" @@ -2,39 +2,47 @@ class Solution { func containsNearbyAlmostDuplicate(_ nums: [Int], _ k: Int, _ t: Int) -> Bool { guard nums.count > 1, k > 0, t >= 0 else { return false } - var ts = SortedSet() + var ts = SortedDictionary() for i in 0..= k { - ts.remove(Int64(nums[i - k])) + ts.removeValue(forKey: Int64(nums[i - k])) } } return false } } -struct SortedSet { - private var elements = [Element]() - - mutating func insert(_ value: Element) { - elements.append(value) - elements.sort() +public struct SortedDictionary { + private var keys = [Key]() + private var values = [Key: Value]() + + public var isEmpty: Bool { + return keys.isEmpty + } + + public mutating func updateValue(_ value: Value, forKey key: Key) { + if values[key] == nil { + keys.append(key) + keys.sort() + } + values[key] = value } - - mutating func remove(_ value: Element) { - if let index = elements.firstIndex(of: value) { - elements.remove(at: index) + + public mutating func removeValue(forKey key: Key) { + if values.removeValue(forKey: key) != nil { + keys.removeAll { $0 == key } } } - - func ceiling(_ value: Element) -> Element? { - for element in elements { - if element >= value { - return element + + public func ceilingKey(_ key: Key) -> Key? { + for k in keys { + if k >= key { + return k } } return nil From b46d73227e546b2d2dd14db2956030603f10aaa1 Mon Sep 17 00:00:00 2001 From: Libin YANG Date: Fri, 14 Jun 2024 17:12:55 +0800 Subject: [PATCH 5/7] Update Solution.swift --- .../Solution.swift" | 169 +++++++++++++++--- 1 file changed, 144 insertions(+), 25 deletions(-) diff --git "a/lcof2/\345\211\221\346\214\207 Offer II 057. \345\200\274\345\222\214\344\270\213\346\240\207\344\271\213\345\267\256\351\203\275\345\234\250\347\273\231\345\256\232\347\232\204\350\214\203\345\233\264\345\206\205/Solution.swift" "b/lcof2/\345\211\221\346\214\207 Offer II 057. \345\200\274\345\222\214\344\270\213\346\240\207\344\271\213\345\267\256\351\203\275\345\234\250\347\273\231\345\256\232\347\232\204\350\214\203\345\233\264\345\206\205/Solution.swift" index 6b7f331987e78..4effc0b19edc9 100644 --- "a/lcof2/\345\211\221\346\214\207 Offer II 057. \345\200\274\345\222\214\344\270\213\346\240\207\344\271\213\345\267\256\351\203\275\345\234\250\347\273\231\345\256\232\347\232\204\350\214\203\345\233\264\345\206\205/Solution.swift" +++ "b/lcof2/\345\211\221\346\214\207 Offer II 057. \345\200\274\345\222\214\344\270\213\346\240\207\344\271\213\345\267\256\351\203\275\345\234\250\347\273\231\345\256\232\347\232\204\350\214\203\345\233\264\345\206\205/Solution.swift" @@ -2,49 +2,168 @@ class Solution { func containsNearbyAlmostDuplicate(_ nums: [Int], _ k: Int, _ t: Int) -> Bool { guard nums.count > 1, k > 0, t >= 0 else { return false } - var ts = SortedDictionary() + var ts = TreeSet() for i in 0..= k { - ts.removeValue(forKey: Int64(nums[i - k])) + ts.remove(Int64(nums[i - k])) } } return false } } -public struct SortedDictionary { - private var keys = [Key]() - private var values = [Key: Value]() +class AVLTreeNode { + var value: T + var height: Int + var left: AVLTreeNode? + var right: AVLTreeNode? + + init(value: T) { + self.value = value + self.height = 1 + } +} - public var isEmpty: Bool { - return keys.isEmpty +class TreeSet { + private var root: AVLTreeNode? + + func insert(_ value: T) { + root = insert(root, value) } - public mutating func updateValue(_ value: Value, forKey key: Key) { - if values[key] == nil { - keys.append(key) - keys.sort() - } - values[key] = value + func remove(_ value: T) { + root = remove(root, value) } - public mutating func removeValue(forKey key: Key) { - if values.removeValue(forKey: key) != nil { - keys.removeAll { $0 == key } - } + func ceiling(_ value: T) -> T? { + return ceiling(root, value) } - public func ceilingKey(_ key: Key) -> Key? { - for k in keys { - if k >= key { - return k + private func insert(_ node: AVLTreeNode?, _ value: T) -> AVLTreeNode { + guard let node = node else { + return AVLTreeNode(value: value) + } + + if value < node.value { + node.left = insert(node.left, value) + } else if value > node.value { + node.right = insert(node.right, value) + } else { + return node + } + + return balance(node) + } + + private func remove(_ node: AVLTreeNode?, _ value: T) -> AVLTreeNode? { + guard let node = node else { + return nil + } + + if value < node.value { + node.left = remove(node.left, value) + } else if value > node.value { + node.right = remove(node.right, value) + } else { + if node.left == nil { + return node.right + } else if node.right == nil { + return node.left + } else { + if let minLargerNode = minNode(node.right) { + node.value = minLargerNode.value + node.right = remove(node.right, minLargerNode.value) + } } } - return nil + + return balance(node) + } + + private func ceiling(_ node: AVLTreeNode?, _ value: T) -> T? { + guard let node = node else { + return nil + } + + if node.value == value { + return node.value + } else if node.value < value { + return ceiling(node.right, value) + } else { + return ceiling(node.left, value) ?? node.value + } + } + + private func height(_ node: AVLTreeNode?) -> Int { + return node?.height ?? 0 } -} \ No newline at end of file + + private func balanceFactor(_ node: AVLTreeNode) -> Int { + return height(node.left) - height(node.right) + } + + private func updateHeight(_ node: AVLTreeNode) { + node.height = 1 + max(height(node.left), height(node.right)) + } + + private func rotateRight(_ y: AVLTreeNode) -> AVLTreeNode { + let x = y.left! + let T2 = x.right + + x.right = y + y.left = T2 + + updateHeight(y) + updateHeight(x) + + return x + } + + private func rotateLeft(_ x: AVLTreeNode) -> AVLTreeNode { + let y = x.right! + let T2 = y.left + + y.left = x + x.right = T2 + + updateHeight(x) + updateHeight(y) + + return y + } + + private func balance(_ node: AVLTreeNode) -> AVLTreeNode { + updateHeight(node) + + let balance = balanceFactor(node) + + if balance > 1 { + if balanceFactor(node.left!) < 0 { + node.left = rotateLeft(node.left!) + } + return rotateRight(node) + } + + if balance < -1 { + if balanceFactor(node.right!) > 0 { + node.right = rotateRight(node.right!) + } + return rotateLeft(node) + } + + return node + } + + private func minNode(_ node: AVLTreeNode?) -> AVLTreeNode? { + var current = node + while current?.left != nil { + current = current?.left + } + return current + } +} From 50392347f2b054c83227391ec46310e8dd4b8e7b Mon Sep 17 00:00:00 2001 From: Libin YANG Date: Fri, 14 Jun 2024 17:13:20 +0800 Subject: [PATCH 6/7] Update README.md --- .../README.md" | 167 +++++++++++++++--- 1 file changed, 143 insertions(+), 24 deletions(-) diff --git "a/lcof2/\345\211\221\346\214\207 Offer II 057. \345\200\274\345\222\214\344\270\213\346\240\207\344\271\213\345\267\256\351\203\275\345\234\250\347\273\231\345\256\232\347\232\204\350\214\203\345\233\264\345\206\205/README.md" "b/lcof2/\345\211\221\346\214\207 Offer II 057. \345\200\274\345\222\214\344\270\213\346\240\207\344\271\213\345\267\256\351\203\275\345\234\250\347\273\231\345\256\232\347\232\204\350\214\203\345\233\264\345\206\205/README.md" index d93b6f75d37a6..18c8354cd9266 100644 --- "a/lcof2/\345\211\221\346\214\207 Offer II 057. \345\200\274\345\222\214\344\270\213\346\240\207\344\271\213\345\267\256\351\203\275\345\234\250\347\273\231\345\256\232\347\232\204\350\214\203\345\233\264\345\206\205/README.md" +++ "b/lcof2/\345\211\221\346\214\207 Offer II 057. \345\200\274\345\222\214\344\270\213\346\240\207\344\271\213\345\267\256\351\203\275\345\234\250\347\273\231\345\256\232\347\232\204\350\214\203\345\233\264\345\206\205/README.md" @@ -816,50 +816,169 @@ class Solution { func containsNearbyAlmostDuplicate(_ nums: [Int], _ k: Int, _ t: Int) -> Bool { guard nums.count > 1, k > 0, t >= 0 else { return false } - var ts = SortedDictionary() + var ts = TreeSet() for i in 0..= k { - ts.removeValue(forKey: Int64(nums[i - k])) + ts.remove(Int64(nums[i - k])) } } return false } } -public struct SortedDictionary { - private var keys = [Key]() - private var values = [Key: Value]() +class AVLTreeNode { + var value: T + var height: Int + var left: AVLTreeNode? + var right: AVLTreeNode? + + init(value: T) { + self.value = value + self.height = 1 + } +} + +class TreeSet { + private var root: AVLTreeNode? - public var isEmpty: Bool { - return keys.isEmpty + func insert(_ value: T) { + root = insert(root, value) } - public mutating func updateValue(_ value: Value, forKey key: Key) { - if values[key] == nil { - keys.append(key) - keys.sort() - } - values[key] = value + func remove(_ value: T) { + root = remove(root, value) } - public mutating func removeValue(forKey key: Key) { - if values.removeValue(forKey: key) != nil { - keys.removeAll { $0 == key } - } + func ceiling(_ value: T) -> T? { + return ceiling(root, value) } - public func ceilingKey(_ key: Key) -> Key? { - for k in keys { - if k >= key { - return k + private func insert(_ node: AVLTreeNode?, _ value: T) -> AVLTreeNode { + guard let node = node else { + return AVLTreeNode(value: value) + } + + if value < node.value { + node.left = insert(node.left, value) + } else if value > node.value { + node.right = insert(node.right, value) + } else { + return node + } + + return balance(node) + } + + private func remove(_ node: AVLTreeNode?, _ value: T) -> AVLTreeNode? { + guard let node = node else { + return nil + } + + if value < node.value { + node.left = remove(node.left, value) + } else if value > node.value { + node.right = remove(node.right, value) + } else { + if node.left == nil { + return node.right + } else if node.right == nil { + return node.left + } else { + if let minLargerNode = minNode(node.right) { + node.value = minLargerNode.value + node.right = remove(node.right, minLargerNode.value) + } } } - return nil + + return balance(node) + } + + private func ceiling(_ node: AVLTreeNode?, _ value: T) -> T? { + guard let node = node else { + return nil + } + + if node.value == value { + return node.value + } else if node.value < value { + return ceiling(node.right, value) + } else { + return ceiling(node.left, value) ?? node.value + } + } + + private func height(_ node: AVLTreeNode?) -> Int { + return node?.height ?? 0 + } + + private func balanceFactor(_ node: AVLTreeNode) -> Int { + return height(node.left) - height(node.right) + } + + private func updateHeight(_ node: AVLTreeNode) { + node.height = 1 + max(height(node.left), height(node.right)) + } + + private func rotateRight(_ y: AVLTreeNode) -> AVLTreeNode { + let x = y.left! + let T2 = x.right + + x.right = y + y.left = T2 + + updateHeight(y) + updateHeight(x) + + return x + } + + private func rotateLeft(_ x: AVLTreeNode) -> AVLTreeNode { + let y = x.right! + let T2 = y.left + + y.left = x + x.right = T2 + + updateHeight(x) + updateHeight(y) + + return y + } + + private func balance(_ node: AVLTreeNode) -> AVLTreeNode { + updateHeight(node) + + let balance = balanceFactor(node) + + if balance > 1 { + if balanceFactor(node.left!) < 0 { + node.left = rotateLeft(node.left!) + } + return rotateRight(node) + } + + if balance < -1 { + if balanceFactor(node.right!) > 0 { + node.right = rotateRight(node.right!) + } + return rotateLeft(node) + } + + return node + } + + private func minNode(_ node: AVLTreeNode?) -> AVLTreeNode? { + var current = node + while current?.left != nil { + current = current?.left + } + return current } } ``` From 8ee14a7de031b4c4dc0649975750177c70e82af5 Mon Sep 17 00:00:00 2001 From: yanglbme Date: Fri, 14 Jun 2024 09:14:23 +0000 Subject: [PATCH 7/7] style: format code and docs with prettier --- .../README.md" | 50 +++++++++---------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git "a/lcof2/\345\211\221\346\214\207 Offer II 057. \345\200\274\345\222\214\344\270\213\346\240\207\344\271\213\345\267\256\351\203\275\345\234\250\347\273\231\345\256\232\347\232\204\350\214\203\345\233\264\345\206\205/README.md" "b/lcof2/\345\211\221\346\214\207 Offer II 057. \345\200\274\345\222\214\344\270\213\346\240\207\344\271\213\345\267\256\351\203\275\345\234\250\347\273\231\345\256\232\347\232\204\350\214\203\345\233\264\345\206\205/README.md" index 18c8354cd9266..0a7445246a6a8 100644 --- "a/lcof2/\345\211\221\346\214\207 Offer II 057. \345\200\274\345\222\214\344\270\213\346\240\207\344\271\213\345\267\256\351\203\275\345\234\250\347\273\231\345\256\232\347\232\204\350\214\203\345\233\264\345\206\205/README.md" +++ "b/lcof2/\345\211\221\346\214\207 Offer II 057. \345\200\274\345\222\214\344\270\213\346\240\207\344\271\213\345\267\256\351\203\275\345\234\250\347\273\231\345\256\232\347\232\204\350\214\203\345\233\264\345\206\205/README.md" @@ -836,7 +836,7 @@ class AVLTreeNode { var height: Int var left: AVLTreeNode? var right: AVLTreeNode? - + init(value: T) { self.value = value self.height = 1 @@ -862,7 +862,7 @@ class TreeSet { guard let node = node else { return AVLTreeNode(value: value) } - + if value < node.value { node.left = insert(node.left, value) } else if value > node.value { @@ -870,15 +870,15 @@ class TreeSet { } else { return node } - + return balance(node) } - + private func remove(_ node: AVLTreeNode?, _ value: T) -> AVLTreeNode? { guard let node = node else { return nil } - + if value < node.value { node.left = remove(node.left, value) } else if value > node.value { @@ -895,15 +895,15 @@ class TreeSet { } } } - + return balance(node) } - + private func ceiling(_ node: AVLTreeNode?, _ value: T) -> T? { guard let node = node else { return nil } - + if node.value == value { return node.value } else if node.value < value { @@ -912,67 +912,67 @@ class TreeSet { return ceiling(node.left, value) ?? node.value } } - + private func height(_ node: AVLTreeNode?) -> Int { return node?.height ?? 0 } - + private func balanceFactor(_ node: AVLTreeNode) -> Int { return height(node.left) - height(node.right) } - + private func updateHeight(_ node: AVLTreeNode) { node.height = 1 + max(height(node.left), height(node.right)) } - + private func rotateRight(_ y: AVLTreeNode) -> AVLTreeNode { let x = y.left! let T2 = x.right - + x.right = y y.left = T2 - + updateHeight(y) updateHeight(x) - + return x } - + private func rotateLeft(_ x: AVLTreeNode) -> AVLTreeNode { let y = x.right! let T2 = y.left - + y.left = x x.right = T2 - + updateHeight(x) updateHeight(y) - + return y } - + private func balance(_ node: AVLTreeNode) -> AVLTreeNode { updateHeight(node) - + let balance = balanceFactor(node) - + if balance > 1 { if balanceFactor(node.left!) < 0 { node.left = rotateLeft(node.left!) } return rotateRight(node) } - + if balance < -1 { if balanceFactor(node.right!) > 0 { node.right = rotateRight(node.right!) } return rotateLeft(node) } - + return node } - + private func minNode(_ node: AVLTreeNode?) -> AVLTreeNode? { var current = node while current?.left != nil {