[LeetCode] 4. Median of Two Sorted Arrays(Python)

[LeetCode] 4. Median of Two Sorted Arrays(Python)

1. 题目

Given two sorted arrays nums1 and nums2 of size m and n respectively, return the median of the two sorted arrays.
The overall run time complexity should be O(log (m+n)).
Example 1:
Input: nums1 = [1,3], nums2 = [2] Output: 2.00000 Explanation: merged array = [1,2,3] and median is 2.

Example 2:

Input: nums1 = [1,2], nums2 = [3,4] Output: 2.50000 Explanation: merged array = [1,2,3,4] and median is (2 + 3) / 2 = 2.5.
Example 3:
Input: nums1 = [0,0], nums2 = [0,0] Output: 0.00000
Example 4:
Input: nums1 = [], nums2 = [1] Output: 1.00000
Example 5:
Input: nums1 = [2], nums2 = [] Output: 2.00000
Constraints:
nums1.length == m
nums2.length == n
0 <= m <= 1000
0 <= n <= 1000
1 <= m + n <= 2000
-106 <= nums1[i], nums2[i] <= 106

2. 题目理解

输入两个排好序的数组,返回两个数组的中位数,时间复杂度为O(log (m+n))。

3. 代码实现

1)思路一
将两个数组混为一个数组并排序,若共有偶数位,则取两个中间值的均值,否则输出中值。

class Solution(object):
	def findMedianSortedArrays(self, nums1, nums2):
        """
        :type nums1: List[int]
        :type nums2: List[int]
        :rtype: float
        """
        m,n = len(nums1), len(nums2)
        nums = sorted(nums1 + nums2)
        med = int((m+n)/2)
        if (m+n)%2 == 0:
            return float(nums[med-1] + nums[med]) / 2
        else:
            return float(nums[med])

分析:使用了库函数sorted(),因此时间复杂度与此库函数有关。

2)思路二
引入寻找第k小的数的函数来避免一些冗余。在getKth()函数中,所有操作在第一个数组长度小于等于第二个的逻辑上产生。若第一个数组为空,则直接输出第二个数组的第k位。若k为1,则输出两个数组第一位中较小的数。k大于1时,对两个数组的k/2位开始比较,若A[k/2]较小,则比A[k/2]小的数最多有k-2个,所以A[k/2]前的数可以被放弃,操作的数组变为(A[k/2:], B, pb),A[k/2]较大时想法类似,抛弃B数组后半部份的数。

class Solution(object):
    def getKth(self, A, B, k):
        lenA, lenB = len(A), len(B)
        if lenA > lenB: return self.getKth(B, A, k)
        if lenA == 0: return B[k - 1]
        if k == 1: return min(A[0], B[0])
        posi_a = min(k/2, lenA)
        posi_b = k - posi_a
        if A[posi_a - 1] <= B[posi_b - 1]:
            return self.getKth(A[posi_a:], B, posi_b)
        else:
            return self.getKth(A, B[posi_b:], posi_a)
    
    def findMedianSortedArrays(self, nums1, nums2):
        """
        :type nums1: List[int]
        :type nums2: List[int]
        :rtype: float
        """
        len1, len2 = len(nums1), len(nums2)
        if (len1 + len2) % 2 == 1: 
            return self.getKth(nums1, nums2, (len1+len2)/2 + 1)
        else:
            return (self.getKth(nums1, nums2, (len1+len2)/2) + self.getKth(nums1, nums2, (len1+len2)/2 + 1)) * 0.5
上一篇:leetcode--复杂度


下一篇:国外浏览器无法访问apple ID页面,显示502 Bad Gateway,解决方法