LeetCode:Median of Two Sorted Arrays

Posted kulor doc

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode:Median of Two Sorted Arrays相关的知识,希望对你有一定的参考价值。

Leetcode:Median of Two Sorted Arrays

题目源自于4. Median of Two Sorted Arrays

题目描述

给定两个数组nums1nums2,满足以下条件:

assert(len(nums1) == m)
assert(len(nums2) == n)
assert(0 <= m <= 1000)
assert(0 <= n <= 1000)
assert(1 <= m + n <= 2000)
assert(-106 <= nums1[i], nums2[i] <= 106)

nums = nums1 + nums2
nums.sort()

需要求出俩数组的中位数,保证算法时间复杂度满足log(m+n)

解题思路

本题目标是以对数时间复杂度返回所有数据的中位数,这里就提出了几点要求:

  1. (m+n)%2 == 1,即len(nums)为奇数时,返回nums[(m+n)//2]

  2. (m+n)%2 == 0,即所有数据为奇数时,返回(nums[(m+n)//2] + nums[(m+n)//2-1])/2

  3. 需要通过二分法搜索中间元素。

如何搜索数据是本题最需要关注的点,常见的二分搜索关注的是有序数据中特定值。本题的关注点在于,如何搜索到一个中位数,因此需要使用二分查找来进行减枝,算法如下:

# mid为中位数
if mid not in nums1[:index1]:
    nums1 = nums1[index1:]
if mid not in nums1[index2:]:
    nums1 = nums1[:index2]

除开减枝算法,如何判定数据是否在当前数据集合内是另一个核心点:

减枝情况

减枝最重要的点在于减去无效数据而保留有可能存在中位数的数据,算法如下:

# mid1 是 nums1的中位数索引
# mid2 是 nums2的中位数索引
# mid 是 目标中位数索引
# 本情况适用于:assert(nums1[mid1] < nums2[mid2])
if (mid1 + mid2 + 1) <= mid:
    nums1 = nums1[mid1+1:] # < mid1的nums1的值不可能出现中位数
else:
    nums2 = nums2[:mid2] # > mid2的nums2的值不可能出现中位数

最终算法:


class Solution:
    def findMedianSortedArrays(self, nums1: List[int], nums2: List[int]) -> float:
        count = len(nums1) + len(nums2)
        if count == 0:
            return 0
        m = count // 2
        if count % 2 == 0:
            return (self._find(nums1, nums2, m) + self._find(nums1, nums2, m-1)) / 2
        return self._find(nums1, nums2, m)
        
    def _find(self, nums_left, nums_right, index):
        if len(nums_left) == 0:
            return nums_right[index]
        if len(nums_right) == 0:
            return nums_left[index]
        
        mid_left = (len(nums_left) - 1)//2
        mid_right = (len(nums_right) - 1)//2
        if nums_left[mid_left] > nums_right[mid_right]:
            nums_left, nums_right = nums_right, nums_left
            mid_left, mid_right = mid_right, mid_left
        mid_high = mid_left + mid_right + 1
        
        if mid_high <= index:
            return self._find(nums_left[mid_left+1:], nums_right, index - mid_left - 1)
        else:
            return self._find(nums_left, nums_right[:mid_right], index)
            

以上是关于LeetCode:Median of Two Sorted Arrays的主要内容,如果未能解决你的问题,请参考以下文章

#Leetcode# 4. Median of Two Sorted Arrays

LeetCode: Median of Two Sorted Arrays

Leetcode 4. Median of Two Sorted Arrays(二分)

LeetCode题解-----Median of Two Sorted Arrays

leetcode-4 Median of Two Sorted Arrays

4. 两个有序数组的中值 [leetcode 4: Median of Two Sorted Arrays]