# coding=utf-8
# 兩有序陣列的第k大
# 一種思路是用o(m+n)的空間複雜度,然後時間複雜度的話只需要o(k)吧,
# 就是從後往前掃k個就ok了
# 另一就是不需要額外的空復,然後時復o(log(m+n))
# 遞迴
# a = [19, 11, 8, 7, 4, 2, 0]
b = [13, 8, 6, 3, 1]
k = 4
m, n = len(a), len(b)
def fun(a,m,b,n,k):
if n>m:
return fun(b,n,a,m,k) # 反正就假定m更長
if k==1:
return a[0] if a[0] > b[0] else b[0]
if k==2:
return min(a[:1] + b[:1])
if k == m+n:
return a[-1] if a[-1] < b[-1] else b[-1]
# 因為兩陣列可能是不定長的,所以先短的補一下
mimest = a[-1] if a[-1] < b[-1] else b[-1]
for i in range(m-n):
c1 = k/2 + 1
c2 = k - c1
while c1 and c2 and c1 < m and c2 < m:
if b[c2-1] >= a[c1] and a[c1-1] >= b[c2]: # 確保左邊是大於右邊的
# 注意這裡寫的是a[c1-1] < b[c2-1] 因為a b兩段是有序的,只需要比較這倆中
# 更小的那乙個,就是我們要的排位在k的那個!!! 這裡比較容易出錯!
return a[c1-1] if a[c1-1] <= b[c2-1] else b[c2-1]
elif a[c1] > b[c2-1]:
c1 += 1
c2 -= 1
else:
c2 += 1
c1 -= 1
for i in range(1, m+n+1):
print fun(a,m,b,n,i), i
4 兩個有序陣列中第k小的數
參考 求兩個有序陣列中第k個元素。要求時間複雜度o log m n 空間複雜度o 1 def median num1,num2,k len1,len2 len num1 len num2 if len1 len2 k 首先得檢查合法行啊 return 1 index1,index2 0,0 whil...
歸併兩個有序陣列
題目 有兩個有序的陣列a1和a2,內存在a1的末尾有足夠多的空餘空間容納a2。請實現乙個函式,把a2中的所有數字插入到a1中並且所有的數字是排序的。解法 從後向前依次比較處理,減少移動次數,提高效率。void sorta1a2 int a1,int length1,int sizeofa1,int ...
合併兩個有序陣列
例如 陣列a1 陣列a2 則合併為a3 思路 依次掃瞄a1和a2的元素 比較當前元素的值,將較小的元素賦給a3,直到乙個陣列掃瞄完畢,然後將另乙個陣列的剩餘元素賦給a3即可。陣列a3的容量需要容納a1和a2兩個陣列和長度和。實現 include include void merge int a1,i...