今日题目
给定两个大小为 m 和 n 的有序数组 nums1 和 nums2 。请找出这两个有序数组的中位数。 要求算法的时间复杂度为 O(log (m+n)) 。你可以假设 nums1 和 nums2 不同时为空。
# 示例1
nums1 = [1, 3]
nums2 = [2]
中位数是 2.0
# 示例2
nums1 = [1, 2]
nums2 = [3, 4]
中位数是 (2 + 3)/2 = 2.5
方法一
这是我见这个题目第一眼就想到的方法,分三步:
1.两个数组拼接,排序
2.测拼接后数组长度,判断奇偶
3.测出中位数下标,求出中位数
class Solution(object):
def findMedianSortedArrays(self,nums1,nums2):
# 拼接数组
nums = nums1 + nums2
#排序
nums.sort()
#测长度
l = len(nums)
#判断奇偶求中位数下标
if l%2 == 0:
index = [l//2-1,l//2]
else:
index = [l//2,l//2]
# 求中位数
median_num = (nums[index[0]]+nums[index[1]])/2.0
return median_num
nums1 = [1,2]
nums2 = [3,4,6]
So = Solution()
result = So.findMedianSortedArrays(nums1,nums2)
print(result)
方法二
class Solution(object):
def findMedianSortedArrays(self, nums1, nums2):
t = nums1 + nums2 #两个数组拼接
t.sort() #合并后排序
l = len(t)
medium = l//2
if l%2 == 1:
return float(t[medium]) # 奇数直接返回中间
else:
return (t[medium-1] + t[medium])/2.0 # 偶数返回前后相加除以2
nums1 = [1,2,4]
nums2 = [3,4,6]
So = Solution()
result = So.findMedianSortedArrays(nums1,nums2)
print(result)
方法三
方法一中排序我们是直接调用了内置函数sort,当然,我们也可以自己实现排序算法,然后和方法一一样的思想执行。
class Solution(object):
def findMedianSortedArrays(self, nums1, nums2):
nums = []
len1 = len(nums1)
len2 = len(nums2)
num1 = num2 = 0
len0 = len1 + len2
for i in range(len0): #遍历两个列表,实现拼接排序
if(num1 == len1): # 列表nums1遍历完
nums.append(nums2[num2])
num2 = num2 + 1
continue
if(num2 == len2):# 列表nums2遍历完
nums.append(nums1[num1])
num1 = num1 + 1
continue
# 从小到大比较,小数先入 nums 列表
if(nums1[num1] <= nums2[num2]):
nums.append(nums1[num1])
num1 = num1 + 1
continue
else:
nums.append(nums2[num2])
num2 = num2 + 1
continue
if(len0%2 == 0):
return (nums[len0//2] + nums[len0//2-1])/2.0
else:
return nums[len0//2]
nums1 = [1,2,4]
nums2 = [3,4,6]
So = Solution()
result = So.findMedianSortedArrays(nums1,nums2)
print(result)
来自 老表 https://mp.weixin.qq.com/s/_MTj0DgJAWWlzfH4C48sZw
老表《简说Python》提供
向林
2020年1月5日于长沙
好好学习,天天向上