数组之寻找两个正序数组的中位数

本文介绍LeetCode4题目的解决方案,通过寻找两个正序数组的中位数,利用分治策略,比较两个数组的第k/2个元素,逐步缩小搜索范围,直至找到目标元素。同时,讨论了处理特殊情况的技巧。
摘要由CSDN通过智能技术生成

LeetCode 4. 寻找两个正序数组的中位数

这个题目可以归结到寻找第k小(大)元素问题
思路可以总结如下:
取两个数组中的第k/2个元素进行比较,如果数组1的元素小于数组2的元素,则说明数组1中的前k/2个元素不可能成为第k个元素的候选,所以将数组1中的前k/2个元素去掉,组成新数组和数组2求第k-k/2小的元素,因为我们把前k/2个元素去掉了,所以相应的k值也应该减小。
另外就是注意处理一些边界条件问题,比如某一个数组可能为空或者k为1的情况。
比如当某一个数组的起始位置大于等于其数组长度时,说明其所有数字均已经被淘汰了,相当于一个空数组了,那么实际上就变成了在另一个数组中找数字,直接就可以找出来了。还有就是如果K=1的话,那么我们只要比较nums1和nums2的起始位置i和j上的数字就可以了

我们使用一个小trick,我们分别找第 (m+n+1) / 2 个,和 (m+n+2) / 2 个,然后求其平均值即可,这对奇偶数均适用。加入 m+n 为奇数的话,那么其实 (m+n+1) / 2 和 (m+n+2) / 2 的值相等,相当于两个相同的数字相加再除以2,还是其本身。

class Solution:
    def findMedianSortedArrays(self, nums1: List[int], nums2: List[int]) -> float:
        len1, len2 = len(nums1), len(nums2)
        left, right = (len1 + len2 + 1) // 2, (len1 + len2 + 2) // 2
        return (self.findKthElement(nums1, nums2, left) + self.findKthElement(nums1, nums2, right))/2
    
    def findKthElement(self, arr1, arr2, k):
        len1, len2 = len(arr1), len(arr2)
        if len1 > len2:
            return self.findKthElement(arr2, arr1, k)
        if not arr1:
            return arr2[k - 1]
        if k == 1:
            return min(arr1[0], arr2[0])
        i, j = min(k // 2, len1) - 1, min(k // 2, len2) - 1
        if arr1[i] > arr2[j]:
            return self.findKthElement(arr1, arr2[j + 1:], k - j - 1)
        else:
            return self.findKthElement(arr1[i + 1:], arr2, k - i - 1)
        
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值