Skip to content

Commit ff118a8

Browse files
committed
solve problem
1 parent 025d380 commit ff118a8

File tree

2 files changed

+161
-0
lines changed

2 files changed

+161
-0
lines changed
Lines changed: 139 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,139 @@
1+
class MedianFinder {
2+
3+
struct Heap {
4+
private var element: [Int] = []
5+
private let isMinHeap: Bool
6+
var count: Int {
7+
return element.count
8+
}
9+
10+
init(isMinHeap: Bool) {
11+
self.isMinHeap = isMinHeap
12+
}
13+
14+
func peek() -> Int? {
15+
return element.first
16+
}
17+
18+
mutating func insert(_ value: Int) {
19+
element.append(value)
20+
21+
var currentIndex = element.count - 1
22+
23+
while currentIndex > 0 {
24+
let parentIndex = (currentIndex - 1) / 2
25+
26+
if isMinHeap {
27+
if element[currentIndex] < element[parentIndex] {
28+
let temp = element[currentIndex]
29+
element[currentIndex] = element[parentIndex]
30+
element[parentIndex] = temp
31+
32+
currentIndex = parentIndex
33+
} else {
34+
break
35+
}
36+
} else {
37+
if element[currentIndex] > element[parentIndex] {
38+
let temp = element[currentIndex]
39+
element[currentIndex] = element[parentIndex]
40+
element[parentIndex] = temp
41+
42+
currentIndex = parentIndex
43+
} else {
44+
break
45+
}
46+
}
47+
}
48+
}
49+
50+
mutating func remove() -> Int? {
51+
guard !element.isEmpty else { return nil }
52+
53+
if element.count == 1 {
54+
return element.removeLast()
55+
}
56+
57+
let value = element[0]
58+
59+
element[0] = element.removeLast()
60+
siftDown(index: 0)
61+
62+
return value
63+
}
64+
65+
mutating private func siftDown(index: Int) {
66+
var parentIndex = index
67+
var count = element.count
68+
69+
while parentIndex < count {
70+
let leftChildIndex = parentIndex * 2 + 1
71+
let rightChildIndex = parentIndex * 2 + 2
72+
var tempIndex = parentIndex
73+
74+
if isMinHeap {
75+
if leftChildIndex < count && element[leftChildIndex] < element[parentIndex] {
76+
tempIndex = leftChildIndex
77+
}
78+
79+
if rightChildIndex < count && element[rightChildIndex] < element[tempIndex] {
80+
tempIndex = rightChildIndex
81+
}
82+
83+
} else {
84+
if leftChildIndex < count && element[leftChildIndex] > element[parentIndex] {
85+
tempIndex = leftChildIndex
86+
}
87+
88+
if rightChildIndex < count && element[rightChildIndex] > element[tempIndex] {
89+
tempIndex = rightChildIndex
90+
}
91+
}
92+
93+
if parentIndex == tempIndex {
94+
break
95+
}
96+
97+
element.swapAt(parentIndex, tempIndex)
98+
parentIndex = tempIndex
99+
}
100+
}
101+
}
102+
103+
private var maxHeap = Heap(isMinHeap: false)
104+
private var minHeap = Heap(isMinHeap: true)
105+
106+
init() {
107+
108+
}
109+
110+
func addNum(_ num: Int) {
111+
if maxHeap.count == 0 {
112+
maxHeap.insert(num)
113+
return
114+
}
115+
116+
if num <= maxHeap.peek()! {
117+
maxHeap.insert(num)
118+
} else {
119+
minHeap.insert(num)
120+
}
121+
122+
if minHeap.count > maxHeap.count {
123+
maxHeap.insert(minHeap.remove()!)
124+
}
125+
126+
if maxHeap.count > minHeap.count + 1 {
127+
minHeap.insert(maxHeap.remove()!)
128+
}
129+
}
130+
131+
func findMedian() -> Double {
132+
if maxHeap.count == minHeap.count {
133+
return Double((maxHeap.peek()! + minHeap.peek()!)) / 2
134+
}
135+
136+
return Double(maxHeap.peek()!)
137+
}
138+
}
139+
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
class Solution {
2+
// Time O(height)
3+
// Space O(height)
4+
func lowestCommonAncestor(_ root: TreeNode?, _ p: TreeNode?, _ q: TreeNode?) -> TreeNode? {
5+
var current = root
6+
7+
while current != nil {
8+
if let p = p, let q = q {
9+
if p.val < current!.val && q.val < current!.val {
10+
current = current?.left
11+
} else if p.val > current!.val && q.val > current!.val {
12+
current = current?.right
13+
} else {
14+
return current
15+
}
16+
}
17+
}
18+
19+
return current
20+
}
21+
}
22+

0 commit comments

Comments
 (0)