LeetCode(4)——Median of Two Sorted Arrays

来源:互联网 发布:解析域名多久生效 编辑:程序博客网 时间:2024/06/05 05:35

Description

There are two sorted arrays nums1 and nums2 of size m and n respectively.

Find the median of the two sorted arrays. The overall run time complexity should be O(log (m+n)).

Example 1:

nums1 = [1, 3]nums2 = [2]The median is 2.0

Example 2:

nums1 = [1, 2]nums2 = [3, 4]The median is (2 + 3)/2 = 2.5

原题连接

Thought

看到这个题之后第一个想法是合并排序找中位数,但是看到要求时间复杂度在O(log(m+n))就觉得肯定不行。之后的想法是分别取两个数组的最小值,比较出较小的,count++,取较小的后面的值在比较,直到中位数,但是这个复杂度是O(1/2(m+n)),也不能满足要求。后来看了网上大神的思路,如下:
把问题一般化找两个数组nums1,nums2中第k大的数:
用nums1,nums2两个数组的中位数m,n将两个数组进行分割nums11,nums12,nums21,nums22
之后比较m与n的大小,得到以下信息:
若 m > n,则有nums21 < nums12,nums21 < nums22 以及 nums12 > nums11,nums12 > nums21
若 m < n,则有nums11 < nums12,nums11 < nums22 以及 nums22 > nums11,nums22 > nums21
得到的这些比较的作用是在于缩小我们寻找第k大的数的范围:
若 m > n,k > (len(nums1)+len(nums2))/2,那么我们可以知道第k大的数肯定不会出现在nums21中,因此我们只需要在nums1和nums22中寻找第k-len(nums2)/2-1大的数
若 m > n,k < (len(nums1)+len(nums2))/2,那么我们可以知道第k大的数肯定不会出现在nums12中,因此我们只需要在nums11和nums2中寻找第k打的数
n < m 的时候可以做类似讨论

Solution

class Solution(object):    def findMedianSortedArrays(self, nums1, nums2):        length = len(nums1) + len(nums2)        if length % 2 == 0:            return (self.findKth(nums1, nums2, length/2)+self.findKth(nums1, nums2, length/2-1))/2.0        else:            return self.findKth(nums1, nums2, length/2)    def findKth(self, nums1, nums2, k):        if not nums1:            return nums2[k]        if not nums2:            return nums1[k]        if k == 0:            return min(nums1[0], nums2[0])        length1 = len(nums1)        length2 = len(nums2)        if nums1[length1/2] > nums2[length2/2]:            if k > length1/2+length2/2:                return self.findKth(nums1, nums2[length2/2+1:], k-length2/2-1)            else:                return self.findKth(num1s[:length1/2], nums2, k)        else:            if k > length1/2+length2/2:                return self.findKth(nums1[length1/2+1:], nums2, k-length1/2-1)            else:                return self.findKth(nums1, nums2[:length2/2], k)
原创粉丝点击