1.1 题目
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)).
You may assume nums1 and nums2 cannot be both empty.
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
题目的思考:
两个数组中的中位数,并且要求在于log(m+n),想到这个的话便想到了二分查找,这是目前通过题目得出信息,分析具体,要找到具体的中位数,所以需要将两个数组合并,然后在进行排序,中位数的特殊位置,查找到中位数,利用python自带的一些方法进行操作。
1.2 代码
class Solution(object):
def findMedianSortedArrays(self, nums1, nums2):
"""
:type nums1: List[int]
:type nums2: List[int]
:rtype: float
"""
if len(nums1) < 1 and len(nums2) <1:
return False
nums1.extend(nums2)
nums1.sort()
mid = len(nums1) // 2
if len(nums1) % 2 == 0:
return (nums1[mid]+nums1[mid-1])/2.0
else:
return nums1[mid]
1.3 对结果的分析
通过提交得出下面的结果
发现这种方式还是属于暴利的方式,而且是通过python的一些封装好的方式去解决,然后查询了leetcode的和其他的博主的方法,了解到了解题的思路:就是利用题目中已经阐述了两组数组都是有序,然后从两组数组的中间位置的数提取出来进行比较,然后中间数大的那一组往递减的方向移动,数小的那一组往递增的方向移动,直到发生两组数比较与前面的比较发生了转换的时候,便说明中位数在这四个数中间的位置。举例分析
备注:图片来自相关链接。
相关代码
def median(A, B):
m, n = len(A), len(B)
if m > n:
A, B, m, n = B, A, n, m
if n == 0:
raise ValueError
imin, imax, half_len = 0, m, (m + n + 1) / 2
while imin <= imax:
i = (imin + imax) / 2
j = half_len - i
if i < m and B[j-1] > A[i]:
# i is too small, must increase it
imin = i + 1
elif i > 0 and A[i-1] > B[j]:
# i is too big, must decrease it
imax = i - 1
else:
# i is perfect
if i == 0: max_of_left = B[j-1]
elif j == 0: max_of_left = A[i-1]
else: max_of_left = max(A[i-1], B[j-1])
if (m + n) % 2 == 1:
return max_of_left
if i == m: min_of_right = B[j]
elif j == n: min_of_right = A[i]
else: min_of_right = min(A[i], B[j])
return (max_of_left + min_of_right) / 2.0
1.4 sort
其实就是系统内部实现了一种综合的排序方法,只是封装好直接用,看似所写的代码短,其实在执行时是进行了排序的,造成时间复杂度的增加,而后面的方法是直接通过递归来实现寻找中位数的方法,极大的减缓了时间复杂度。
1.5 相关链接
1.LeetCode 004 Median of Two Sorted Arrays 详细分析(图片来源)
2.C++,java,Python的内部实现sort怎么实现的,有什么不同?
3.leetcode官方答案
4.python sort函数内部实现原理