LeetCode重点题系列之【4. Median of Two Sorted Arrays】

本文介绍了一种寻找两个有序数组中位数的方法,通过使用双指针技巧,确保了整体运行时间复杂度为O(log(m+n))。文中提供了一个具体的Python实现示例。

There are two sorted arrays nums1 and nums2 of size m and n respectively.

Find the median of the two sorted arrays. The overall run time complexity should be O(log (m+n)).

You may assume nums1 and nums2 cannot be both empty.

Example 1:

nums1 = [1, 3]
nums2 = [2]

The median is 2.0

Example 2:

nums1 = [1, 2]
nums2 = [3, 4]

The median is (2 + 3)/2 = 2.5

This problem is quite easy, just use two pointers, if the element of pointer one smaller than pointer2's, we add pointer one, else we add pointer2, append the current element to the result list. The median elements will always end at half of the sum of nums1's length add nums2's length. For the odd length just return the last element in the result list, for the even length, we should add the last two numbers and divided by 2.

class Solution(object):
    def findMedianSortedArrays(self, nums1, nums2):
        """
        :type nums1: List[int]
        :type nums2: List[int]
        :rtype: float
        """
        len1 = len(nums1)
        len2 = len(nums2)
        pointer1 = pointer2 = 0
        count = 0
        target = 0
        odd = True
        target = (len1 + len2) / 2
        if (len1 + len2) % 2 == 0:
            odd = False
        res = self.helper(nums1, nums2, pointer1, pointer2, target)
        if odd:
            return res[-1]
        else:
            return (float(res[-1]) + float(res[-2]))/2.0

    def helper(self, nums1, nums2, pointer1, pointer2, target):
        len1 = len(nums1)
        len2 = len(nums2)
        res = []
        while pointer1 < len1 and pointer2 < len2:
            if nums1[pointer1] < nums2[pointer2]:
                res.append(nums1[pointer1])
                pointer1 += 1
            else:
                res.append(nums2[pointer2])
                pointer2 += 1
            if len(res) == target + 1:
                return res
        while pointer1 < len1:
            res.append(nums1[pointer1])
            pointer1 += 1
            if len(res) == target + 1:
                return res
        while pointer2 < len2:
            res.append(nums2[pointer2])
            pointer2 += 1
            if len(res) == target + 1:
                return res

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值