題目如下:
給定兩個大小為 m 和 n 的正序(從小到大)陣列 nums1 和 nums2。請你找出並返回這兩個正序陣列的中位數。
高階:你能設計乙個時間複雜度為 o(log (m+n)) 的演算法解決此問題嗎?
示例 1:
輸入:nums1 = [1,3], nums2 = [2]
輸出:2.00000
解釋:合併陣列 = [1,2,3] ,中位數 2
示例 2:
輸入:nums1 = [1,2], nums2 = [3,4]
輸出:2.50000
解釋:合併陣列 = [1,2,3,4] ,中位數 (2 + 3) / 2 = 2.5
根據時間複雜度大小很容易聯想到二分法
參考了下折半排序法**
折半插入排序利用二分法的思想,在乙個有序的序列中,找到新元素在該序列中的位置,然後插入。如圖1所示,共有n個元素,前i個元素已經是有序序列,現在要將第i個元素插入其中。折半插入排序需要做兩步工作:找到待插入元素的位置、插入。
首先要定義兩個指標(不是語法裡面的指標,是下標的意思)low和high用於尋找a[i]的插入位置,low指向a[0],high指向a[i-1],中點mid=(low+high)/2。
比較a[i]與a[mid]的大小,若a[i]>a[mid],說明a[i]的位置應該在midhigh之間,將區間[low,high]縮短為[mid+1,high],令指標low=mid+1;若a[i]<=a[mid],說明a[i]的位置應該在lowmid之間,將區間壓縮為[low,mid-1],令指標high=mid-1。每次折半之後,a[i]的位置應該在[low,high]之間。
如此迴圈,low與high漸漸靠近,直到low>high跳出迴圈,a[i]的位置找到,low即為a[i]應該放置的位置。
找到a[i]的位置之後進行插入,先將a[low]~a[i-1]這些元素向後平移乙個元素的位置,然後將a[i]放到low位置。
**如下:
class
solution
(object):
deffindmediansortedarrays
(self, nums1, nums2)
:"""
:type nums1: list[int]
:type nums2: list[int]
:rtype: float
"""nums=
for i in nums1:
for i in nums2:
for i in
range
(len
(nums)):
temp=nums[i]
low=
0 high=i-
1while
(low<=high)
: mid=
(low+high)//2
if temp
: high=mid-
1else
: low=mid+
1 j=i-
1while
(j>high)
: nums[j+1]
=nums[j]
j=j-
1 nums[low]
=temp
iflen(nums)%2
!=0:return nums[
len(nums)//2
]else
:return
(nums[
len(nums)//2
-1]+nums[
len(nums)//2
])/2
nums1 =[1
,5,8
,2,3
]nums2 =[3
]result=solution(
).findmediansortedarrays(nums1,nums2)
print
(result)
尋找兩個正序陣列中的中位數
給定兩個大小為 m 和 n 的正序 從小到大 陣列nums1和nums2。請你找出這兩個正序陣列的中位數,並且要求演算法的時間複雜度為o log m n 示例 1 nums1 1 3 nums2 2 則中位數是 2.0示例 2 nums1 1 2 nums2 3 4 則中位數是 2 3 2 2.5方...
尋找兩個正序陣列的中位數
尋找兩個正序陣列的中位數 二分法根據中位數的定義,當 m n 是奇數時,中位數是兩個有序陣列中的第 m n 2 個元素,當 m n 是偶數時,中位數是兩個有序陣列中的第 m n 2 個元素和第 m n 2 1 個元素的平均值。因此,這道題可以轉化成尋找兩個有序陣列中的第 k 小的數,其中 k 為 m...
尋找兩個正序陣列的中位數
題目 給定兩個大小為 m 和 n 的正序 從小到大 陣列 nums1 和 nums2。請你找出這兩個正序陣列的中位數,並且要求演算法的時間複雜度為 o log m n 你可以假設 nums1 和 nums2 不會同時為空。示例 1 nums1 1,3 nums2 2 則中位數是 2.0 思路 因為兩...