其他題目 兩個有序陣列間相加和的TopK問題

2021-08-10 14:26:31 字數 2697 閱讀 2852

【題目】

給定兩個有序陣列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...