【題目】
給定兩個有序陣列arr1和arr2,再給定乙個整數k,返回來自arr1和arr2的兩個數相加和最大的前k個,兩個數必須分別來自兩個陣列。要求時間複雜度o(klogk)。
【基本思路】
使用大根堆結構。假設arr1的長度是m,arr2的長度是n。因為是排序陣列,arr1中最後乙個數加上arr2中最後乙個數一定就是最大的相加和。將這個數壓入大根堆中。然後從大根堆中彈出乙個堆頂,此時這個堆頂一定是(m-1, n-1)位置的和,表示獲得乙個最大相加和。然後,將兩個相鄰位置的和再放入堆中,即位置(m-1,n-2)和(m-2, n-1),因為除(m-1, n-1)位置的和外,最大的相加和一定在位置(m-1,n-2)和(m-2, n-1)中產生。重新調整大根堆,然後繼續彈出,繼續將彈出元素的兩個相鄰位置新增到堆中,直到彈出的元素達到k個。
【**實現】
#python3.5
class
heap:
def__init__
(self, row, col, value):
self.row = row
self.col = col
self.value = value
defgettopksum
(arr1, arr2, k):
defheapinsert
(heap, row, col, data, i):
node = heap(row, col, data)
heap[i] = node
parent = (i-1) // 2
while parent >= 0
and heap[parent].value < heap[i].value:
heap[parent], heap[i] = heap[i], heap[parent]
i = parent
parent = (i-1) // 2
defpophead
(heap, heapsize):
res = heap[0]
heap[0], heap[heapsize-1] = heap[heapsize-1], heap[0]
heapify(heap, 0, heapsize-1)
return res
defheapify
(heap, i, heapsize):
left = 2 * i + 1
right = 2 * i + 2
most = i
while left < heapsize:
if heap[left].value > heap[i].value:
most = left
if right < heapsize and heap[right].value > heap[most].value:
most = right
if most == i:
break
else:
heap[most], heap[i] = heap[i], heap[most]
i = most
left = 2 * i + 1
right = 2 * i + 2
defiscontains
(row, col, posset):
return
'_'.join([str(row),str(col)]) in posset
defaddpostoset
(row, col, posset):
posset.add('_'.join([str(row), str(col)]))
if arr1 == none
or arr2 == none
or k < 1
or k > len(arr1) * len(arr2):
return
heap = [0
for i in range(k+1)]
row = len(arr1) - 1
col = len(arr2) - 1
heapsize = 0
heapinsert(heap, row, col, arr1[row] + arr2[col], heapsize)
heapsize += 1
posset = set()
count = 0
res =
while count < k:
cur = pophead(heap, heapsize)
heapsize -= 1
r = cur.row
c = cur.col
ifnot iscontains(r-1,c, posset):
heapinsert(heap, r-1, c, arr1[r-1] + arr2[c], heapsize)
heapsize += 1
addpostoset(r-1, c, posset)
ifnot iscontains(r, c-1, posset):
heapinsert(heap, r, c-1, arr1[r] + arr2[c-1], heapsize)
heapsize += 1
addpostoset(r, c-1, posset)
count += 1
return res
兩個有序陣列間相加和的Topk問題
兩個有序陣列間相加和的topk問題 給定兩個有序陣列arr1和arr2,再給定乙個整數k,返回來自arr1和arr2的兩個數相加和最大的前k個,兩個數必須分別來自兩個陣列 按照降序輸出 要求 時間複雜度為o k log k o k log k o klogk 輸入描述 第一行三個整數n,k分別表示陣...
歸併兩個有序陣列
題目 有兩個有序的陣列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...