题: 给定两个长度为m 和 n 有序组数array1 和array2,请找出这个有序数组的中位数。
'''
eg.
[1,3]和[5,6],中位数是4
[1,2,5,8,9]和[2,3,4,5],中位数是4
'''
### 直接方法,使用内置排序函数sort
# 时间复杂度最高:O((n+m)log(n+m)),空间复杂度:O(n+m)
1 class Solution(object): 2 def findmedian(self,nums1,nums2): 3 nums3=nums1+nums2 4 nums3.sort() 5 return (nums3[len(nums3)//2]+nums3[(len(nums3)-1)//2])/2 6 # eg. 7 nums1=[1,2,5,8,9] 8 nums2=[2,3,4,5] 9 demo=Solution() 10 re=demo.findmedian(nums1,nums2) 11 print(re) # 4.0 再取个整
### 利用双指针将两个数组排序
# 时间复杂度最高:O(n+m),空间复杂度:O(n+m)
1 class Solution2(object): 2 def findmedian(self,nums1,nums2): 3 nums3=[] 4 j=i=0 5 # 利用双指针将两个数组排序 6 while(i<len(nums1) and j<len(nums2)): 7 if nums1[i]<nums2[j]: 8 nums3.append(nums1[i]) 9 i+=1 10 else: 11 nums3.append(nums2[j]) 12 j+=1 13 if i==len(nums1) and j!=len(nums2): 14 for x in nums2[j:]: 15 nums3.append(nums2[x]) 16 if j==len(nums2) and i!=len(nums1): 17 for x in nums1[i:]: 18 nums3.append(nums1[x]) 19 # 返回len(nums3)/2 和(len(nums3)-1)/2 向下取整的均值 20 return (nums3[len(nums3) // 2] + nums3[(len(nums3) - 1) // 2]) / 2
### 采用二分法,再分治处理
# 时间复杂度最高:O(log(min(n+m))),空间复杂度:O(1)
1 class Solution3: 2 # 定义一个取数组中位数的函数 3 def getmediannum(self,nums): 4 return (nums[len(nums) // 2] + nums[(len(nums) - 1) // 2]) / 2 5 6 def findmedian(self,array1,array2): 7 len1=len(array1) 8 len2=len(array2) 9 # array1为短数组,array2为短数组,不符合则换 10 if len1>len2: 11 return self.findmedian(array2,array1) 12 13 if len1<=2: # 较短的数组长度小于等于2 14 if len2>4: # 较长的数组长度大于4, 15 p1=math.ceil(len2/2)-2 # math.ceil()向上取整 16 array2=array2[p1:-p1] # 取数组中间部分 17 # 合并两部分再排序 18 nums=array1+array2 19 nums.sort() 20 # 可以直接对剩余部分寻找中位数 21 return self.getmediannum(nums) 22 23 p2=math.ceil(len1/2)-1 24 # 较短的数组长度大于2 25 # 当较短的数组的中位数较小时,array1 中位数之前的所有元素就被截去,array2 尾部截去相同的长度,再递归两数组 26 if self.getmediannum(array1)<self.getmediannum(array2): 27 return self.findmedian(array1[p2:],array2[:-p2]) 28 else: 29 return self.findmedian(array1[:-p2],array2[p2:]) 30 # eg. 31 nums1=[1,2,5,8,9] 32 nums2=[2,3,4,5] 33 demo3=Solution3() 34 re=demo3.findmedian(nums1,nums2) 35 print(re) # 4.0 再取个整
标签:nums,--,array2,array1,分治,中位数,数组,nums3 From: https://www.cnblogs.com/yuntimer/p/17691692.html
2023-9-10笔记