Advertisement
Guest User

Untitled

a guest
Jan 21st, 2019
63
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.26 KB | None | 0 0
  1. class Solution:
  2. def findMedianSortedArrays(self, nums1, nums2):
  3. """
  4. :type nums1: List[int]
  5. :type nums2: List[int]
  6. :rtype: float
  7. """
  8.  
  9. if len(nums1) == 0:
  10. return self.median(nums2)
  11. elif len(nums2) == 0:
  12. return self.median(nums1)
  13.  
  14. l = len(nums2) + len(nums1)
  15.  
  16. even = l % 2 == 0
  17.  
  18. if even:
  19. m1 = self.findMed(nums1, nums2, True)
  20. m2 = self.findMed(nums1, nums2, False)
  21. return (m1 + m2)/2
  22. else:
  23. return self.findMed(nums1, nums2, True)
  24.  
  25.  
  26. def median(self, num):
  27. if len(num) % 2 == 0:
  28. return (num[(len(num) - 1 ) //2] + num[len(num) //2]) /2
  29. else:
  30. return num[(len(num)) //2]
  31.  
  32. def findMed(self, nums1, nums2, first):
  33. # print ( 'in findMed', nums1, nums2, first)
  34. ma = max(nums1[len(nums1) - 1], nums2[len(nums2) - 1])
  35. mi = min(nums1[0], nums2[0])
  36.  
  37. r = ma
  38. l = mi
  39.  
  40. mid = (r + l)//2
  41. while l <= r:
  42.  
  43. cmp = self.cmpMedian(nums1, nums2, mid, first)
  44. # print('here', l, r, 'mid ', mid, 'cmp ', cmp)
  45. if cmp == 0:
  46. return mid
  47. elif cmp > 0:
  48. r = mid - 1
  49. else:
  50. l = mid + 1
  51.  
  52. def cmpMedian(self, num1, num2, k ,first):
  53. # print ( 'in cmpMedian', num1, num2, k, first)
  54. l = len(num2) + len(num1)
  55. even = l % 2 == 0
  56.  
  57. if not even:
  58. if self.less(num1, num2, k) > l//2:
  59. # print ('less 1,', num1, num2, k, self.less(num1, num2, k))
  60. return 1
  61. if self.less(num1, num2, k + 1) < l//2:
  62. # print ('less -1,', num1, num2, k + 1, self.less(num1, num2, k + 1))
  63. return -1
  64. else:
  65. # print('less returning 0')
  66. return 0
  67.  
  68. else:
  69. if first:
  70. if self.less(num1, num2, k) > l//2:
  71. return 1
  72. if self.less(num1, num2, k + 1) < l//2:
  73. return -1
  74. else:
  75. return 0
  76. else:
  77. if self.less(num1, num2, k) > (l + 1)//2:
  78. return 1
  79. if self.less(num1, num2, k + 1) < (l+ 1)//2:
  80. return -1
  81. else:
  82. return 0
  83.  
  84.  
  85. def less(self, num1, num2, k):
  86. # print ( 'in less', num1, num2, k)
  87. l = 0
  88. r = len(num1) - 1
  89. res = -1
  90. while l <= r:
  91. mid = (l + r)//2
  92. if num1[mid] == k:
  93. res = mid
  94. break
  95. if num1[mid] < k:
  96. l = mid + 1
  97. else:
  98. r = mid -1
  99. if res == -1: res = l
  100.  
  101. l = 0
  102. r = len(num2) - 1
  103. while l <= r:
  104. mid = (l + r)//2
  105. if num2[mid] == k:
  106. return res + mid
  107. if num2[mid] < k:
  108. l = mid + 1
  109. else:
  110. r = mid -1
  111.  
  112. return res + l
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement