Leetcode(4)寻找两个有序数组的中位数
Leetcode(4)寻找两个有序数组的中位数
[题目表述]:
给定两个大小为 m 和 n 的有序数组 nums1 和* nums2*。
请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n))。
你可以假设 nums1 和 nums2 不会同时为空。
第一种方法:list拼接排列取中位数
执行用时:116 ms ; 内存消耗:11.8MB 效果:还行
class Solution(object):
def findMedianSortedArrays(self, nums1, nums2):
"""
:type nums1: List[int]
:type nums2: List[int]
:rtype: float
"""
nums1.extend(nums2)
sort_nums1=sorted(nums1)
number=len(sort_nums1)
if number%2==1 :
average_nums=sort_nums1[number/2]
else: average_nums=float((sort_nums1[number/2]+sort_nums1[number/2-1]))/2
return average_nums
学习
-
整数/2在leetcode上 取整有点迷
-
分奇偶情况
第二种方法:归并排序
执行用时:124 ms; 内存消耗:11.8MB
class Solution(object):
def findMedianSortedArrays(self, nums1, nums2):
"""
:type nums1: List[int]
:type nums2: List[int]
:rtype: float
"""
number=len(nums1)+len(nums2)
end=number/2+1
p1,p2=0,0
res=[]
while p1 < len(nums1) or p2 < len(nums2):
if p1 >= len(nums1):
res.append(nums2[p2])
p2 += 1
elif p2 >= len(nums2):
res.append(nums1[p1])
p1 += 1
else:
num1, num2 = nums1[p1], nums2[p2]
if num1 <= num2:
res.append(num1)
p1 += 1
else:
res.append(num2)
p2 += 1
if len(res) == end:
if number%2==1 :
mid=res[-1]
else:
mid=(res[-1]+res[-2])*1.0/2
return mid
学习
- 对于已经排列好的数组,使用归并排序合并两个数组再找很好