@@ -11,36 +11,38 @@ using namespace std;
11
11
class Solution {
12
12
public:
13
13
double findMedianSortedArrays (int A[], int m, int B[], int n) {
14
- if (m == 0 && n == 0 ) return 0.0 ;
15
14
return findMedianSortedArrays2 (A, m, B, n);
16
15
}
17
16
18
17
double findMedianSortedArrays1 (int A[], int m, int B[], int n) {
19
- int i = 0 , j = 0 , m1 = - 1 , m2 = - 1 ;
20
- for (int k = 0 ; k <= (m+n)/ 2 ; k++ ) {
21
- m1 = m2 ;
22
- if (j == n || (i < m && A[i] < B[j])) m2 = A[i++];
23
- else m2 = B[j++];
18
+ int r1 = - 1 , r2 = - 1 , i = 0 , j = 0 ;
19
+ for (int k = (m + n) / 2 ; k >= 0 ; k-- ) {
20
+ r1 = r2 ;
21
+ if (j == n || (i < m && A[i] <= B[j])) r2 = A[i++];
22
+ else r2 = B[j++];
24
23
}
25
-
26
- if ((m+n)%2 ) return (double )m2;
27
- return (m1+m2)/2.0 ;
24
+ if ((m + n) % 2 ) return (double )r2;
25
+ return (r1 + r2) / 2.0 ;
28
26
}
29
27
30
28
double findMedianSortedArrays2 (int A[], int m, int B[], int n) {
31
- if ((m+n)%2 ) return (double )findKth (A, m, B, n, (m+n)/2 +1 );
32
- return (findKth (A, m, B, n, (m+n)/2 )+findKth (A, m, B, n, (m+n)/2 +1 ))/2.0 ;
29
+ int k = (m + n) / 2 ;
30
+ if ((m + n) % 2 ) return findKth (A, m, B, n, k + 1 );
31
+ return (findKth (A, m, B, n, k) + findKth (A, m, B, n, k + 1 )) / 2.0 ;
33
32
}
34
33
35
34
int findKth (int A[], int m, int B[], int n, int k) {
36
- if (m > n ) return findKth (B, n, A, m, k) ;
37
- if (m == 0 ) return B[k- 1 ];
35
+ if (n == 0 ) return A[k - 1 ] ;
36
+ if (m == 0 ) return B[k - 1 ];
38
37
if (k == 1 ) return min (A[0 ], B[0 ]);
39
-
40
- int p1 = min (k/2 , m), p2 = k-p1;
41
- if (A[p1-1 ] < B[p2-1 ]) return findKth (A+p1, m-p1, B, n, k-p1);
42
- if (A[p1-1 ] > B[p2-1 ]) return findKth (A, m, B+p2, n-p2, k-p2);
43
- return A[p1-1 ];
38
+ if (m / 2 + n / 2 + 1 >= k) {
39
+ if (A[m / 2 ] <= B[n / 2 ]) return findKth (A, m, B, n / 2 , k);
40
+ else return findKth (A, m / 2 , B, n, k);
41
+ }
42
+ else {
43
+ if (A[m / 2 ] <= B[n / 2 ]) findKth (A + m / 2 + 1 , m - (m / 2 + 1 ), B, n, k - (m / 2 + 1 ));
44
+ else return findKth (A, m, B + n / 2 + 1 , n - (n / 2 + 1 ), k - (n / 2 + 1 ));
45
+ }
44
46
}
45
47
};
46
48
0 commit comments