LeetCode 4 寻找两个正序数组中的中位数
一、题目概述
给定两个大小为m和n的正序数组,返回两个正序数组的中位数。
二、解法思路:
最朴实的方法,从第一个开始比较,置两个指针,然后一个一个比较,谁小谁加1,直到加够。复杂度是 O ( m + n ) O(m+n) O(m+n)
另外个方法:考虑一个函数,是找到第K个数,那么给定两个数组,那么就是从两个数组中找到一个这样的分割,使得在分割线左边的数量等于K。同时只要确定一个数组中分割线的位置,就可以确定另一组分割线的位置(总数K相同)。同时需要满足,左边的所有数小于右边的所有数。
三、代码
最朴实的代码(复杂度 O ( m + n ) O(m+n) O(m+n))
class Solution:
def findMedianSortedArrays(self, nums1, nums2 ):
num = 0
min_1,min_2 = 0,0
length = len(nums1) + len(nums2)
while(num< (length/2+1)):
left = nums1[0] if(len(nums1) > 0) else 10**6
right = nums2[0] if(len(nums2) > 0) else 10**6
if(left < right):
min_x = left
if (len(nums1) > 0):
nums1.pop(0)
else:
min_x = right
if(len(nums2)>0):
nums2.pop(0)
min_1 = min_2
min_2 = min_x
num = num + 1
if(length % 2 !=0):
print("奇数")
return min_1
else:
print("偶数")
return (min_1+min_2)/2
复杂度降低的代码 O ( l o g ( m + n ) ) O(log(m+n)) O(log(m+n))
class Solution:
def findMedianSortedArrays(self, nums1, nums2 ):
length = len(nums1)+len(nums2)
min_list = nums1 if len(nums1) < len(nums2) else nums2
max_list = nums1 if len(nums1) >= len(nums2) else nums2
K = int(length / 2)
start = 0
end = len(min_list)
while(True):
div_1 = int((start+end)/2)
div_2 = K - div_1 - 1
x_i,x_i1,y_i,y_i1 = self.get_value(min_list,max_list,div_1-1,div_2)
if (x_i > y_i1):
end = div_1
elif (y_i > x_i1):
start = div_1+1
else:
print(x_i,x_i1)
print(y_i,y_i1)
if(length % 2 ==0):
return ( max(x_i,y_i) + min(x_i1,y_i1))/2
else:
return min(x_i1,y_i1)
def get_value(self,nums1,nums2,i,j):
if(i<0):
x_i = -10**6
else:
x_i = nums1[i]
if( i < (len(nums1)-1)):
x_i1 = nums1[i+1]
else:
x_i1 = 10**6
if (j < 0):
y_i = -10 ** 6
else:
y_i = nums2[j]
if (j < (len(nums2) - 1)):
y_i1 = nums2[j + 1]
else:
y_i1 = 10 ** 6
return x_i,x_i1,y_i,y_i1