兩個有序陣列的第k大數

2021-09-25 21:46:01 字數 1130 閱讀 1618

# 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...