今天第一次在LeetCode做hard级别的题目:Median of Two Sorted Arrays.
题目大意是这样的:给两个排好序的数组,让找出它们合成一个数组的时候的中位数。数组的长度分别为m,n,要求时间复杂度为O(log(m+n))。本来拿到这个题目,一眼看过去感觉有点熟悉,有点归并排序的影子。如果真是归并排序的话,这已经是最后一步。但是题目要求的时间复杂度是O(log(m+n)),而用归并的话基本上是m+n级别的。做出来不难,难的是控制这个时间复杂度。
折腾了半天,吭吭哧哧弄出一个solution,总体思路是找到较短的那个数组,找出它的中位数,然后根据该数可以每次删去较短数组长度的那么多的项,具体可以见下面代码。时间复杂度不好估计,但是应该<O(logm+logn),基本上可以认为是达到要求了吧。
我的代码:
#!/usr/bin/python
#coding=utf8
"""
# Author: qwqian
# Created Time : 2017-12-17 13:22:31
# File Name: medianOfTwoSortedArray.py
# Description:
"""
class Solution(object):
def findMedianSortedArrays(self, nums1, nums2):
"""
:type nums1: List[int]
:type nums2: List[int]
:rtype: float
"""
m = len(nums1)
n = len(nums2)
if n > m:
nums1, nums2 = nums2, nums1
m, n = n, m
if n == 0:
if m == 0:
return None
elif m % 2 == 1:
return nums1[m/2]/1.0
else:
return (nums1[m/2-1] + nums1[m/2])/2.0
if n == 1:
if m % 2 == 0:
if nums2[0] < nums1[m/2 - 1]:
return nums1[m/2 -1]
elif nums2[0] < nums1[m/2]:
return nums2[0]
else:
return nums1[m/2]
else:
if m == 1:
return (nums1[0] + nums2[0]) / 2.0
else:
if nums2[0] < nums1[m/2 - 1]:
return (nums1[m/2 -1] + nums1[m/2]) / 2.0
elif nums2[0] < nums1[m/2 + 1]:
return (nums1[m/2] + nums2[0]) / 2.0
else:
return (nums1[m/2] + nums1[m/2 + 1]) / 2.0
a = nums2[n/2]
b = nums1[n/2]
c = nums1[m - n/2 - 1]
d = nums2[n/2-1]
if m == n:
b,c = c,b
if a < b:
nums2 = nums2[n/2 : n]
nums1 = nums1[0 : m - n/2]
elif a > c:
if d < b:
if n % 2 == 0:
nums2 = []
else:
nums2 = [a]
else:
nums2 = nums2[0 : n - n/2]
nums1 = nums1[n/2 : m]
else:
if d < b:
nums2 = nums2[n/2 : n]
nums1 = nums1[0 : m - n/2]
else:
nums1 = nums1[n/2 : m - n/2]
return self.findMedianSortedArrays(nums1, nums2)
def main():
nums1 = [1,2,3]
nums2 = [4,5,6]
solution = Solution()
result = solution.findMedianSortedArrays(nums1, nums2)
print result
if __name__ == "__main__":
main()
我刷题之后习惯会看看前面高手们的解题方法,有助于打开思路提高自己,然后我看到了这个代码(排在第二):
class Solution(object):
def findMedianSortedArrays(self, nums1, nums2):
"""
:type nums1: List[int]
:type nums2: List[int]
:rtype: float
"""
all_nums = nums1 + nums2
len_all = len(all_nums)
all_nums.sort()
if len_all == 0:
return None
elif len_all == 1:
return all_nums[0]
elif len_all == 2:
return ((all_nums[0] + all_nums[1]) / 2.0)
if len_all % 2 == 0:
median = (all_nums[(len(all_nums) / 2)] + all_nums[(len(all_nums) / 2) - 1]) / 2.0
else:
median = all_nums[(len(all_nums) / 2)]
return median
人用了一个Python自带的sort函数。。。。。。
内心有种日了狗的感觉。