LeetCode4-寻找两个有序数组的中位数(python语言)

题目描述:
给定两个大小为 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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/median-of-two-sorted-arrays
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

首先来看一段代码:

def find_middle_number(nums1,nums2):
	num=nums1+nums2
	num.sort()
	mid=len(num)//2
	if len(num)%2==0:
		return (num[mid]+num[mid-1])/2
	else:
		return num[mid]
middle_number=find_middle_number([1,2],[3,4])
print(middle_number)

这种方法直接合并两个数组,并且直接用Python内建函数sort()进行排序,但这种方法的时间复杂度为
在这里插入图片描述
参考题解之后的二分法:

class Solution:
    def findMedianSortedArrays(self, nums1, nums2) -> float:
        m, n = len(nums1), len(nums2)
        # 这里为了保证nums1一定是长度较小的数组
        if m > n:
            nums1, nums2, m, n = nums2, nums1, n, m
        # 题目给定数组不会同时为空,也就是m^2+n^2≠0,由于m≤n,故只要n≠0即可
        if not n:
            raise ValueError("数组长度不同时为零")
       	i_min, i_max = 0, m
       	# left集合元素数量,如果m+n是奇数,left比right多一个数据
        count_of_left = (m + n + 1) // 2  
        while i_min <= i_max:
            i = (i_min + i_max) // 2  				# left有i个nums1的元素
            j = count_of_left - i  					# left有j个nums2的元素
            if i > 0 and nums1[i - 1] > nums2[j]:
                i_max = i - 1						# i太大,要减少
            elif i < m and nums1[i] < nums2[j - 1]:
                i_min = i + 1						# i太小,要增加
            else:
                if i == 0:
                    max_of_left = nums2[j - 1]
                elif j == 0:
                    max_of_left = nums1[i - 1]
                else:
                    max_of_left = max(nums1[i - 1], nums2[j - 1])
                if (m + n) % 2:
                    return float(max_of_left)				# 结果是浮点数
                if i == m:
                    min_of_right = nums2[j]
                elif j == n:
                    min_of_right = nums1[i]
                else:
                    min_of_right = min(nums1[i], nums2[j])
                return (max_of_left + min_of_right) / 2.0	# 结果为浮点数
s=Solution()
print(s.findMedianSortedArrays([1,2],[3,4]))

你可能感兴趣的:(leetcode)