-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path295_find_median.swift
101 lines (95 loc) · 2.67 KB
/
295_find_median.swift
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
class MedianFinder {
var count : Int = 0
var leftArr : [Int] = []
var rightArr : [Int] = []
var m1 : Int = 0
var m2 : Int = 0
init() {
}
func addNum(_ num: Int) {
if count == 0 {
m1 = num
} else if count == 1 {
if num > m1 {
m2 = num
} else {
m2 = m1
m1 = num
}
} else if count == 2 {
if num < m1{
leftArr.append(num)
rightArr.append(m2)
} else if num > m1 && num < m2 {
leftArr.append(m1)
m1 = num
rightArr.append(m2)
} else {
leftArr.append(m1)
m1 = m2
rightArr.append(num)
}
} else if count % 2 == 1 {
// case 1: num <= current median
if num <= m1 {
m2 = m1
let leftMax = leftArr.removeLast()
if leftMax > num {
m1 = leftMax
leftArr.append(num)
leftArr.sort { $0 < $1 }
} else {
m1 = num
leftArr.append(leftMax)
}
}
// case 2: num > current median
else {
let rightMin = rightArr.removeLast()
if rightMin < num {
m2 = rightMin
rightArr.append(num)
rightArr.sort { $0 > $1 }
} else {
m2 = num
rightArr.append(rightMin)
}
}
} else if count % 2 == 0 {
// case 1: num <= current median
if num <= m1 {
leftArr.append(num)
leftArr.sort { $0 < $1 }
rightArr.append(m2)
}
// case 2: m1 < num < m2
else if m1 < num && num <= m2 {
leftArr.append(m1)
rightArr.append(m2)
m1 = num
}
// case 3: num > current median
else {
rightArr.append(num)
rightArr.sort { $0 > $1 }
leftArr.append(m1)
m1 = m2
}
m2 = 0
}
count += 1
}
func findMedian() -> Double {
if count % 2 == 1 {
return Double(m1)
} else {
return Double(m1+m2)/2.0
}
}
}
/**
* Your MedianFinder object will be instantiated and called as such:
* let obj = MedianFinder()
* obj.addNum(num)
* let ret_2: Double = obj.findMedian()
*/