LeetCode:Median of Two Sorted Arrays
Posted kulor doc
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode:Median of Two Sorted Arrays相关的知识,希望对你有一定的参考价值。
Leetcode:Median of Two Sorted Arrays
题目描述
给定两个数组nums1
、nums2
,满足以下条件:
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)
。
解题思路
本题目标是以对数时间复杂度返回所有数据的中位数,这里就提出了几点要求:
-
当
(m+n)%2 == 1
,即len(nums)
为奇数时,返回nums[(m+n)//2]
。 -
当
(m+n)%2 == 0
,即所有数据为奇数时,返回(nums[(m+n)//2] + nums[(m+n)//2-1])/2
。 -
需要通过二分法搜索中间元素。
如何搜索数据是本题最需要关注的点,常见的二分搜索关注的是有序数据中特定值。本题的关注点在于,如何搜索到一个中位数,因此需要使用二分查找来进行减枝,算法如下:
# 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