|  | 
| 1 | 1 | class Solution(object): | 
|  | 2 | +    # def findMedianSortedArrays(self, nums1, nums2): | 
|  | 3 | +    #     """ | 
|  | 4 | +    #     :type nums1: List[int] | 
|  | 5 | +    #     :type nums2: List[int] | 
|  | 6 | +    #     :rtype: float | 
|  | 7 | +    #     """ | 
|  | 8 | +    #     p1 = p2 = 0 | 
|  | 9 | +    #     ls1 = len(nums1) | 
|  | 10 | +    #     ls2 = len(nums2) | 
|  | 11 | +    #     all_nums = [] | 
|  | 12 | +    #     median = 0.0 | 
|  | 13 | +    #     while p1 < ls1 and p2 < ls2: | 
|  | 14 | +    #         if nums1[p1] < nums2[p2]: | 
|  | 15 | +    #             all_nums.append(nums1[p1]) | 
|  | 16 | +    #             p1 += 1 | 
|  | 17 | +    #         else: | 
|  | 18 | +    #             all_nums.append(nums2[p2]) | 
|  | 19 | +    #             p2 += 1 | 
|  | 20 | +    #     if p1 < ls1: | 
|  | 21 | +    #         while p1 < ls1: | 
|  | 22 | +    #             all_nums.append(nums1[p1]) | 
|  | 23 | +    #             p1 += 1 | 
|  | 24 | +    #     if p2 < ls2: | 
|  | 25 | +    #         while p2 < ls2: | 
|  | 26 | +    #             all_nums.append(nums2[p2]) | 
|  | 27 | +    #             p2 += 1 | 
|  | 28 | +    #     # print all_nums | 
|  | 29 | +    #     if (ls1 + ls2) % 2 == 1: | 
|  | 30 | +    #         median = all_nums[(ls1 + ls2) / 2] | 
|  | 31 | +    #     else: | 
|  | 32 | +    #         median = 1.0 * (all_nums[(ls1 + ls2) / 2] + all_nums[(ls1 + ls2) / 2 - 1]) / 2 | 
|  | 33 | +    #     return median | 
|  | 34 | + | 
| 2 | 35 |     def findMedianSortedArrays(self, nums1, nums2): | 
| 3 |  | -        """ | 
| 4 |  | -        :type nums1: List[int] | 
| 5 |  | -        :type nums2: List[int] | 
| 6 |  | -        :rtype: float | 
| 7 |  | -        """ | 
| 8 |  | -        p1 = p2 = 0 | 
| 9 |  | -        ls1 = len(nums1) | 
| 10 |  | -        ls2 = len(nums2) | 
| 11 |  | -        all_nums = [] | 
| 12 |  | -        median = 0.0 | 
| 13 |  | -        while p1 < ls1 and p2 < ls2: | 
| 14 |  | -            if nums1[p1] < nums2[p2]: | 
| 15 |  | -                all_nums.append(nums1[p1]) | 
| 16 |  | -                p1 += 1 | 
|  | 36 | +        N1, N2 = len(nums1), len(nums2) | 
|  | 37 | +        if N1 < N2: | 
|  | 38 | +            nums1, N1, nums2, N2 = nums2, N2, nums1, N1 | 
|  | 39 | +        l, r = 0, N2 * 2 | 
|  | 40 | +        while l <= r: | 
|  | 41 | +            mid2 = (l + r) >> 1 | 
|  | 42 | +            mid1 = N1 + N2 - mid2 | 
|  | 43 | +            L1 = -sys.maxint - 1 if mid1 == 0 else nums1[(mid1 - 1) >> 1] | 
|  | 44 | +            L2 = -sys.maxint - 1 if mid2 == 0 else nums2[(mid2 - 1) >> 1] | 
|  | 45 | +            R1 = sys.maxint if mid1 == 2 * N1 else nums1[mid1 >> 1] | 
|  | 46 | +            R2 = sys.maxint if mid2 == 2 * N2 else nums2[mid2 >> 1] | 
|  | 47 | +            if L1 > R2: | 
|  | 48 | +                l = mid2 + 1 | 
|  | 49 | +            elif L2 > R1: | 
|  | 50 | +                r = mid2 - 1 | 
| 17 | 51 |             else: | 
| 18 |  | -                all_nums.append(nums2[p2]) | 
| 19 |  | -                p2 += 1 | 
| 20 |  | -        if p1 < ls1: | 
| 21 |  | -            while p1 < ls1: | 
| 22 |  | -                all_nums.append(nums1[p1]) | 
| 23 |  | -                p1 += 1 | 
| 24 |  | -        if p2 < ls2: | 
| 25 |  | -            while p2 < ls2: | 
| 26 |  | -                all_nums.append(nums2[p2]) | 
| 27 |  | -                p2 += 1 | 
| 28 |  | -        # print all_nums | 
| 29 |  | -        if (ls1 + ls2) % 2 == 1: | 
| 30 |  | -            median = all_nums[(ls1 + ls2) / 2] | 
| 31 |  | -        else: | 
| 32 |  | -            median = 1.0 * (all_nums[(ls1 + ls2) / 2] + all_nums[(ls1 + ls2) / 2 - 1]) / 2 | 
| 33 |  | -        return median | 
|  | 52 | +                return (max(L1, L2) + min(R1, R2)) / 2.0 | 
| 34 | 53 | 
 | 
| 35 | 54 | 
 | 
| 36 | 55 | if __name__ == '__main__': | 
|  | 
0 commit comments