diff --git a/counting-bits/sonjh1217.swift b/counting-bits/sonjh1217.swift new file mode 100644 index 000000000..1680c3aed --- /dev/null +++ b/counting-bits/sonjh1217.swift @@ -0,0 +1,35 @@ +class Solution { + // Brute Force + // O(nlogn) time / O(n) space + func countBits(_ n: Int) -> [Int] { + var numberOfOnes = [Int]() + for i in 0...n { + var numberOfOne = 0 + var i = i + + while i > 0 { + numberOfOne += i & 1 + i >>= 1 + } + + numberOfOnes.append(numberOfOne) + } + + return numberOfOnes + } + + // Dynamic Programming + // O(n) time / O(n) space + func countBitsDP(_ n: Int) -> [Int] { + var numberOfOnes = [Int](repeating: 0, count: n + 1) + if n < 1 { + return numberOfOnes + } + + for i in 1...n { + numberOfOnes[i] = numberOfOnes[i >> 1] + (i & 1) + } + return numberOfOnes + + } +} diff --git a/subtree-of-another-tree/sonjh1217.swift b/subtree-of-another-tree/sonjh1217.swift new file mode 100644 index 000000000..a8b6e5870 --- /dev/null +++ b/subtree-of-another-tree/sonjh1217.swift @@ -0,0 +1,57 @@ +/** + * Definition for a binary tree node. + * public class TreeNode { + * public var val: Int + * public var left: TreeNode? + * public var right: TreeNode? + * public init() { self.val = 0; self.left = nil; self.right = nil; } + * public init(_ val: Int) { self.val = val; self.left = nil; self.right = nil; } + * public init(_ val: Int, _ left: TreeNode?, _ right: TreeNode?) { + * self.val = val + * self.left = left + * self.right = right + * } + * } + */ +class Solution { + // O(n * m) time / O(n) space + func isSubtree(_ root: TreeNode?, _ subRoot: TreeNode?) -> Bool { + let subRootNode = subRoot?.val + + var queue = [TreeNode]() + guard let root = root else { + return false + } + queue.append(root) + var head = 0 + while queue.count > head { + let currentNode = queue[head] + head += 1 + if currentNode.val == subRootNode { + if dfs(node: currentNode, subRoot: subRoot) { + return true + } + } + + if let left = currentNode.left { + queue.append(left) + } + if let right = currentNode.right { + queue.append(right) + } + } + + return false + } + + func dfs(node: TreeNode?, subRoot: TreeNode?) -> Bool { + guard let node = node, let subRoot = subRoot else { + return node == nil && subRoot == nil + } + + return node.val == subRoot.val + && dfs(node: node.left, subRoot: subRoot.left) + && dfs(node: node.right, subRoot: subRoot.right) + } + +}