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

Posted 李志琦的博客

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了4. 寻找两个有序数组的中位数相关的知识,希望对你有一定的参考价值。

链接:https://leetcode-cn.com/problems/median-of-two-sorted-arrays

给定两个大小为 m 和 n 的有序数组?nums1 和?nums2。

请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为?O(log(m + n))。

你可以假设?nums1?和?nums2?不会同时为空。

先说自己的解法

写了一个\(O(log(m)^2)\)的算法,时间有点多,击败了14%的python3

基本思路就是把两个数组重新排序,但是比较的时候比较头部的元素,然后二分查找比较小的那一只数组里所有小于另一个头的元素。其实有点浪费了。题目只要找到中位数,中位数就是比一半大,比一半小。大或者小就不用排序。
具体思路看官方题解。

class Solution:
    def findSmallerIndex(self,nums,target): # 先找到第一个大于target 的坐标,减去一就是不大于target 的下标最大值
        head_index = 0
        tail = len(nums)
        tail_index = tail
        while head_index<=tail_index:
            mid_index = (head_index+tail_index)//2
            mid = nums[mid_index]
            if mid<=target and (mid_index+1>=tail or nums[mid_index+1]>target):
                return mid_index
            elif mid>target:
                tail_index = mid_index - 1
            elif mid<=target:
                head_index = mid_index + 1 
        
    def findMedianSortedArrays(self, nums1: List[int], nums2: List[int]) -> float:
        nums_all = []
        lens_all = len(nums1)+len(nums2)
        while len(nums1) or len(nums2):
            if len(nums1)==0:
                nums_all.extend(nums2)
            elif len(nums2)==0:
                nums_all.extend(nums1)
            elif nums1[0] <= nums2[0]:
                index = self.findSmallerIndex(nums1,nums2[0])
                nums_all.extend(nums1[:index+1])
                nums1 = nums1[index+1:]
            elif nums1[0] > nums2[0]:
                index = self.findSmallerIndex(nums2,nums1[0])
                nums_all.extend(nums2[:index+1])
                nums2 = nums2[index+1:]
            if len(nums_all)>=lens_all//2+1:
                break;
        return (nums_all[lens_all//2]+nums_all[(lens_all-1)//2])/2

以上是关于4. 寻找两个有序数组的中位数的主要内容,如果未能解决你的问题,请参考以下文章

4. 寻找两个游有序数组的中位数

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

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

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

二分 - 寻找两个有序数组的中位数 - Leetcode 4

[LeetCode] 4. 寻找两个有序数组的中位数