先了解一下題目的意思,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 ...