LeeetCode4. Median of Two Sorted Arrays
Posted wilderness
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeeetCode4. Median of Two Sorted Arrays相关的知识,希望对你有一定的参考价值。
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
题意:找出两个数组的中间值
思路:首先是想利用像归并排序的方法,排序完成后,选出中间值,但是时间复杂度就不是O(log(m+n))了
从网上找到另一种方法,我写下我自己理解的思路:
找出中间值,也就是找出第K小的数
借用二分查找法的思路,第k/2小的值在或者不在短的数组中,就比如短的数组事nums1。
如果k/2在短的数组中,就比较nums1[k/2]和nums2[k/2],比如如果nums1[k/2]更小,那么就可以排除掉nums1中,索引k/2之前的所有数。
如果k/2不在短的数组中,就比较nums1[len(nums1)]和nums2[k-len(nums1)]的值,谁更小,就排除掉哪个数组
如果两个值相等,就找到了!
1 class Solution(object): 2 def findMedianSortedArrays(self, nums1, nums2): 3 """ 4 :type nums1: List[int] 5 :type nums2: List[int] 6 :rtype: float 7 """ 8 len1 = len(nums1) 9 len2 = len(nums2) 10 l = len1 + len2 11 if l&0x1 == 1: 12 return self.findK(nums1,len1,nums2,len2,l/2+1) 13 else: 14 return (self.findK(nums1,len1,nums2,len2,l/2)+self.findK(nums1,len1,nums2,len2,l/2+1))*1.0/2 15 16 def findK(self,nums1,len1,nums2,len2,k): 17 if len1>len2: 18 return self.findK(nums2,len2,nums1,len1,k) 19 if len1 == 0: 20 return nums2[k-1] 21 if k == 1: 22 return min(nums1[0],nums2[0]) 23 mid = k/2 24 pa = min(mid,len1) 25 pb = k-pa 26 if nums1[pa-1] < nums2[pb-1]: 27 return self.findK(nums1[pa:],len1-pa,nums2,len2,k-pa) 28 elif nums1[pa-1] > nums2[pb-1]: 29 return self.findK(nums1,len1,nums2[pb:],len2-pb,k-pb) 30 else: 31 return nums1[pa-1]
以上是关于LeeetCode4. Median of Two Sorted Arrays的主要内容,如果未能解决你的问题,请参考以下文章
LeetCode--median-of-two-sorted-arrays
leedcode Median of Two Sorted Arrays
#Leetcode# 4. Median of Two Sorted Arrays
LeetCode: Median of Two Sorted Arrays