尋找兩個正序陣列中的中位數(python)

2021-10-25 10:25:51 字數 2147 閱讀 5752

題目如下:

給定兩個大小為 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 思路 因為兩...