跟着专注于计算机视觉的AndyJ的妈妈我学算法之每日一题leetcode4寻找两个正序数组的中位数

leetcode第4题。两个数组的中位数,第一想法就是归并,比较容易。然后就是减少空间复杂度,不用额外数组存归并后的数组。再进一步,就是用二分法来做。二分法要多想想,因为细节太多了,容易出错。
好了,看题看代码。
题:

4. 寻找两个正序数组的中位数
给定两个大小为 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:

class Solution:
    def findMedianSortedArrays(self, nums1: List[int], nums2: List[int]) -> float:
        n1 = len(nums1)
        n2 = len(nums2)
        mid = (n1 + n2) // 2  # 奇数 return nums[mid]
        if (n1+n2)%2 == 0:
            even = True # 偶数
        else:
            even = False
        res = []
        p1 = 0
        p2 = 0
        while len(res) <= mid:
            if p2>=n2 or (p1<n1 and nums1[p1] < nums2[p2]):
                res.append(nums1[p1])
                p1 += 1
            else:
                res.append(nums2[p2])
                p2 += 1
        if even:
            return (res[-1]+res[-2]) / 2
        else:
            return res[-1]

代码循序渐进2:

class Solution:
    def findMedianSortedArrays(self, nums1: List[int], nums2: List[int]) -> float:
        n1 = len(nums1)
        n2 = len(nums2)
        mid = (n1 + n2) // 2  # 奇数 return nums[mid]
        if (n1+n2)%2 == 0:
            even = True # 偶数
        else:
            even = False

        p1 = 0
        p2 = 0
        if p2>=n2 or (p1<n1 and nums1[p1] < nums2[p2]):
            cur = nums1[p1]
        else:
            cur = nums2[p2]

        while (p1+p2) <= mid:
            temp = cur
            if p2>=n2 or (p1<n1 and nums1[p1] < nums2[p2]):
                cur = nums1[p1]
                p1 += 1
            else:
                cur = nums2[p2]
                p2 += 1
        if even:
            return (cur+temp) / 2
        else:
            return cur

代码循序渐进3:

class Solution:
    def findMedianSortedArrays(self, nums1: List[int], nums2: List[int]) -> float:
    	n1 = len(nums1)
        n2 = len(nums2)

        left = (n1+n2+1) //2
        right = (n1+n2+2) // 2

        def dfs(nums1, nums2, k):
            l1 = len(nums1)
            l2 = len(nums2)
            if not nums1:
                return nums2[k-1]
            if not nums2:
                return nums1[k-1]
            if k==1:
                return min(nums1[0], nums2[0])
            
            i = min(l1,k//2)-1
            j = min(l2,k//2)-1

            if nums1[i] > nums2[j]:
                return dfs(nums1, nums2[j+1:], k-j-1)
            else:
                return dfs(nums1[i+1:], nums2, k-i-1)

        if left == right:
            return dfs(nums1, nums2, left)
        res1 = dfs(nums1, nums2, left)
        res2 = dfs(nums1, nums2, right)
        return (res1 + res2) / 2

好了,记得二分法的方法要多看看,细节太多了,要多写写,注意理清逻辑。
好了。

猜你喜欢

转载自blog.csdn.net/mianjiong2855/article/details/107711480