2個有序數列合併後求中位數

2021-10-09 10:09:10 字數 1887 閱讀 4731

先了解一下題目的意思,2個有序的數列合併後求中位數,先要分情況討論,2個數列的個數之和n是奇數還是偶數,如果是奇數,則中位數就是第int(n/2)+1個數,如果是偶數,則中位數就是第(n/2)個數和第(n/2)+1個數之和除2,問題到最後其實就是求2個數列合併後的第k個數。

a=[1

,2,3

,4,7

,11,22

,33,44

]b=[1

,7,33

,37,55

,77,88

,99,111

,123]c=

a_flag=

0b_flag=

0while

(a_flag <

len(a)

and b_flag <

len(b)):

if(a[a_flag]

< b[b_flag]):

) a_flag=a_flag+

1elif

(a[a_flag]

> b[b_flag]):

) b_flag=b_flag+

1else:)

a_flag = a_flag +

1 b_flag=b_flag+

1if a_flag ==

len(a)

:for i in

range

(b_flag,

len(b)):

)else

:for i in

range

(a_flag,

len(a)):

)print

(c)lenth=

len(c)

print

(lenth)

if lenth%2==

0:print

((c[

int(lenth/2)

-1]+c[

int(lenth/2)

])/2

)else

:print

(c[int

(lenth/2)

])

a=[1

,2,3

,4,7

,11,22

,33,44

]b=[1

,7,33

,37,55

,77,88

,99,111

,123

]#條件a的長度小於b,a和b有序

len_a=

len(a)

len_b=

len(b)

len_ab=len_a+len_b

#找到2個列表合併後的第k個數

k=int

(len_ab/2)

+1while

(k>1)

:print

(k)if

(a[int

(k/2)-

1]>b[

int(k/2)

-1])

: b=b[

int(k/2)

:]else

: a=a[

int(k/2)

:]print

(a,b)

k=int(k-

int(k/2)

)#如何a的長度大於b的長度則互換位置

iflen

(a)>

len(b)

: t=a

a=bb=t

if a[k-1]

< b[k-1]

:print

(a[k]-1

)else

:print

(b[k-1]

)

兩個有序陣列求合併後,求其中位數?

第一步 假設兩個有序陣列 已經各自排序完成了 長度相等,試寫函式找出兩個陣列合併後的中位數?第二步 假設兩個有序陣列長度不等,一樣的求出中位數?思想是二分查詢。解析 這個題目看起來非常簡單。第一題的話 假設陣列長度為n,那麼我就把陣列1和陣列2直接合併,然後再直接找到中間元素。對於這樣的方案,第一題...

查詢兩個有序陣列合併後的中位數

例題 查詢兩個有序陣列合併後的中位數 題目 兩個有序陣列查詢合併之後的中位數。給定兩個大小為 m 和 n 的正序 從小到大 陣列 nums1 和 nums2。請你找出這兩個正序數組合在一起之後的中位數,並且要求演算法的時間複雜度為 o log m n 你可以假設 nums1 和 nums2 不會同時...

尋找2個有序陣列的中位數

給定兩個大小為 m 和 n 的有序陣列 nums1 和 nums2。請你找出這兩個有序陣列的中位數,並且要求演算法的時間複雜度為 o log m n 你可以假設 nums1 和 nums2 不會同時為空。示例 1 nums1 1,3 nums2 2 則中位數是 2.0 示例 2 nums1 1,2 ...