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..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" @@ -809,6 +809,180 @@ 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 = TreeSet() + for i in 0..= k { + ts.remove(Int64(nums[i - k])) + } + } + return false + } +} + +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? + + func insert(_ value: T) { + root = insert(root, value) + } + + func remove(_ value: T) { + root = remove(root, value) + } + + func ceiling(_ value: T) -> T? { + return ceiling(root, value) + } + + 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 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 + } +} +``` + 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..4effc0b19edc9 --- /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,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 = TreeSet() + for i in 0..= k { + ts.remove(Int64(nums[i - k])) + } + } + return false + } +} + +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? + + func insert(_ value: T) { + root = insert(root, value) + } + + func remove(_ value: T) { + root = remove(root, value) + } + + func ceiling(_ value: T) -> T? { + return ceiling(root, value) + } + + 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 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 + } +}

AltStyle によって変換されたページ (->オリジナル) /