@@ -412,6 +412,123 @@ public class MedianFinder {
412
412
*/
413
413
```
414
414
415
+ #### Swift
416
+
417
+ ``` swift
418
+ class MedianFinder {
419
+ private var lowerHalf = Heap< Int > (sort : > )
420
+ private var upperHalf = Heap< Int > (sort : < )
421
+
422
+ init () {}
423
+
424
+ func addNum (_ num : Int ) {
425
+ if lowerHalf.count == 0 || num <= lowerHalf.peek ()! {
426
+ lowerHalf.insert (num)
427
+ } else {
428
+ upperHalf.insert (num)
429
+ }
430
+
431
+ if lowerHalf.count > upperHalf.count + 1 {
432
+ upperHalf.insert (lowerHalf.remove ()! )
433
+ } else if upperHalf.count > lowerHalf.count {
434
+ lowerHalf.insert (upperHalf.remove ()! )
435
+ }
436
+ }
437
+
438
+ func findMedian () -> Double {
439
+ if lowerHalf.count > upperHalf.count {
440
+ return Double (lowerHalf.peek ()! )
441
+ } else {
442
+ return (Double (lowerHalf.peek ()! ) + Double (upperHalf.peek ()! )) / 2.0
443
+ }
444
+ }
445
+ }
446
+
447
+ struct Heap <T > {
448
+ var elements: [T]
449
+ let sort: (T, T) -> Bool
450
+
451
+ init (sort : @escaping (T, T) -> Bool ) {
452
+ self .sort = sort
453
+ self .elements = []
454
+ }
455
+
456
+ var count: Int {
457
+ return elements.count
458
+ }
459
+
460
+ func peek () -> T? {
461
+ return elements.first
462
+ }
463
+
464
+ mutating func insert (_ value : T) {
465
+ elements.append (value)
466
+ siftUp (from : elements.count - 1 )
467
+ }
468
+
469
+ mutating func remove () -> T? {
470
+ guard ! elements.isEmpty else { return nil }
471
+ if elements.count == 1 {
472
+ return elements.removeLast ()
473
+ } else {
474
+ let value = elements[0 ]
475
+ elements[0 ] = elements.removeLast ()
476
+ siftDown (from : 0 )
477
+ return value
478
+ }
479
+ }
480
+
481
+ private mutating func siftUp (from index : Int ) {
482
+ var child = index
483
+ var parent = parentIndex (of : child)
484
+ while child > 0 && sort (elements[child], elements[parent]) {
485
+ elements.swapAt (child, parent)
486
+ child = parent
487
+ parent = self .parentIndex (of : child)
488
+ }
489
+ }
490
+
491
+ private mutating func siftDown (from index : Int ) {
492
+ var parent = index
493
+ while true {
494
+ let left = leftChildIndex (of : parent)
495
+ let right = rightChildIndex (of : parent)
496
+ var candidate = parent
497
+ if left < elements.count && sort (elements[left], elements[candidate]) {
498
+ candidate = left
499
+ }
500
+ if right < elements.count && sort (elements[right], elements[candidate]) {
501
+ candidate = right
502
+ }
503
+ if candidate == parent {
504
+ return
505
+ }
506
+ elements.swapAt (parent, candidate)
507
+ parent = candidate
508
+ }
509
+ }
510
+
511
+ private func parentIndex (of index : Int ) -> Int {
512
+ return (index - 1 ) / 2
513
+ }
514
+
515
+ private func leftChildIndex (of index : Int ) -> Int {
516
+ return 2 * index + 1
517
+ }
518
+
519
+ private func rightChildIndex (of index : Int ) -> Int {
520
+ return 2 * index + 2
521
+ }
522
+ }
523
+
524
+ /**
525
+ * Your MedianFinder object will be instantiated and called as such:
526
+ * let obj = MedianFinder();
527
+ * obj.addNum(num);
528
+ * let param_2 = obj.findMedian();
529
+ */
530
+ ```
531
+
415
532
<!-- tabs:end -->
416
533
417
534
<!-- solution:end -->
0 commit comments