题目链接: Median of Two Sorted Arrays
这道题坑还是有点多的,刚看到的时候第一反应是:这不就是归并排序....还是图样啊。所以先这样提交了:
class Solution(object):
def findMedianSortedArrays(self, nums1, nums2):
"""
:type nums1: List[int]
:type nums2: List[int]
:rtype: float
"""
idx1 = 0
idx2 = 0
a = 0
b = 0
while idx1 + idx2 != (len(nums1) + len(nums2))//2 + 1:
print(idx1, idx2)
if idx1 == len(nums1) and idx2 < len(nums2):
a = b
b = nums2[idx2]
idx2+=1
elif idx2 == len(nums2) and idx1 < len(nums1):
a = b
b = nums1[idx1]
idx1+=1
elif idx1 == len(nums1) and idx2 == len(nums2):
break
else:
if nums1[idx1] <= nums2[idx2]:
a = b
b = nums1[idx1]
idx1+=1
else:
a = b
b = nums2[idx2]
idx2+=1
print '-------'
print a, b
if (len(nums1) + len(nums2)) % 2 == 0:
return (float)(a + b)/2
else:
return b
其实暴力算法也不是很好写的,会有很多坑爹的边界问题。
黑人文号.jpg
看了下别人的做法才恍然大悟..其实可以转换为找第k大的数,可以将时间复杂度从O(n)降到O(lgn):
class Solution(object):
def findMedianSortedArrays(self, nums1, nums2):
"""
:type nums1: List[int]
:type nums2: List[int]
:rtype: float
"""
n = len(nums1) + len(nums2)
if n % 2:
return self.find_kth(nums1, nums2, n//2 + 1)
else:
return float(self.find_kth(nums1, nums2, n//2) + self.find_kth(nums1, nums2, n//2 + 1)) / 2
def find_kth(self, nums1, nums2, k):
#print nums1, nums2, k
len1 = len(nums1)
len2 = len(nums2)
if len1 == 0:
return nums2[k - 1]
if len2 == 0:
return nums1[k - 1]
if k == 1:
return min(nums1[0], nums2[0])
idx = k//2
if idx > min(len1, len2):
idx = min(len1, len2)
#print idx
if nums1[idx - 1] <= nums2[idx - 1]:
return self.find_kth(nums1[idx:], nums2, k - idx)
else:
return self.find_kth(nums1, nums2[idx:], k - idx)