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. 寻找两个有序数组的中位数的主要内容,如果未能解决你的问题,请参考以下文章