1
+ /**
2
+ * Question Link: https://leetcode.com/problems/median-of-two-sorted-arrays/
3
+ *
4
+ * Primary idea: For arrays of m and n numbers, nums1 and nums2, where m <= n.
5
+ * To find an index of mid1 in nums1, to separate the arrays into left and right parts:
6
+ * nums1[0, 1, ..., mid1 - 1] | nums1[mid1, mid1 + 1, ..., m]
7
+ * nums2[0, 1, ..., mid2 - 1] | nums2[mid2, mid2 + 1, ..., n]
8
+ *
9
+ * Make sure:
10
+ * count of left = count of right
11
+ * max of left <= min of right
12
+ *
13
+ * Time Complexity: O(log(n + m)), Space Complexity: O(1)
14
+ *
15
+ */
16
+
17
+ class Solution {
18
+ func findMedianSortedArrays( nums1: [ Int ] , _ nums2: [ Int ] ) -> Double {
19
+ let m = nums1. count
20
+ let n = nums2. count
21
+
22
+ if m > n {
23
+ return findMedianSortedArrays ( nums2, nums1)
24
+ }
25
+
26
+ var halfLength : Int = ( m + n + 1 ) >> 1
27
+ var b = 0 , e = m
28
+ var maxOfLeft = 0
29
+ var minOfRight = 0
30
+
31
+ while b <= e {
32
+ let mid1 = ( b + e) >> 1
33
+ let mid2 = halfLength - mid1
34
+
35
+ if mid1 > 0 && mid2 < n && nums1 [ mid1 - 1 ] > nums2 [ mid2] {
36
+ e = mid1 - 1
37
+ } else if mid2 > 0 && mid1 < m && nums1 [ mid1] < nums2 [ mid2 - 1 ] {
38
+ b = mid1 + 1
39
+ } else {
40
+ if mid1 == 0 {
41
+ maxOfLeft = nums2 [ mid2 - 1 ]
42
+ } else if mid2 == 0 {
43
+ maxOfLeft = nums1 [ mid1 - 1 ]
44
+ } else {
45
+ maxOfLeft = max ( nums1 [ mid1 - 1 ] , nums2 [ mid2 - 1 ] )
46
+ }
47
+
48
+ if ( m + n) % 2 == 1 {
49
+ return Double ( maxOfLeft)
50
+ }
51
+
52
+ if mid1 == m {
53
+ minOfRight = nums2 [ mid2]
54
+ } else if mid2 == n {
55
+ minOfRight = nums1 [ mid1]
56
+ } else {
57
+ minOfRight = min ( nums1 [ mid1] , nums2 [ mid2] )
58
+ }
59
+
60
+ break
61
+ }
62
+ }
63
+ return Double ( maxOfLeft + minOfRight) / 2.0
64
+ }
65
+ }
0 commit comments