有兩個序列A和B,求k個最小的(ai bj)

2021-06-18 14:55:11 字數 645 閱讀 2295

題目:有兩個序列a和b,a=(a1,a2,...,ak),b=(b1,b2,...,bk),a和b都按公升序排列,對於1<=i,j<=k,求k個最小的(ai+bj),要求演算法盡量高效。

解法一:看到這個題目,第乙個想法就是求出所有組合的加法結果,然後建立乙個大小為k的堆,利用這堆來求出最小的k個和值。那麼這種方法需要花費o(k^2)來求出所有組合的和值,然後花費o(k^2lgk)時間來找出滿足要求的k個和值。所以最終時間複雜度為o(k^2lgk)。空間複雜度為o(k).

解法二:題目中之處序列a和序列b均按公升序排列,且元素個數均為k個。假如(ai+bj)屬於k個最小的和值之一,則可以知道對於任何1<=p<=i,以及1<=q<=j,都有(ap+bq) <= (ai+bj),即(ap+bq)屬於k個最小的和值之一。那麼當我們知道(ai+bj)滿足條件之後,事實上,我們便知道了(i + j - 1)(之所以要減一是因為按此處的方法算p和q時,a1+b1會被多算一次)個和值均滿足這個條件。這樣一來,實際上問題便轉換成了求所有滿足   (i + j - 1)=k的i和j,取其中ai+bj最小的那組i和j,則所有1<=p<=i以及1<=q<=j的(ap+bq)就為最小的k個和值之一。即問題轉換為了求k的和式組合問題。

按照這種方法,時間複雜度是o(k)用於求最小的i和j的組合,以及o(i*j)用於輸出結果。空間複雜度為o(1)。

32 求兩個序列的和的最小差值

題目 有兩個序列a,b,大小都為n,序列元素的值任意整數,無序 要求 通過交換a,b中的元素,使 序列a元素的和 與 序列b元素的和 之間的差最小。例如 var a 100,99,98,1,2,3 var b 1,2,3,4,5,40 解法一 假設序列a,b中元素的和為sum a和sum b。假設a...

合併兩個有序列表

1.尾遞迴 1 def recursion merge sort2 l1,l2,tmp 2if len l1 0 or len l2 0 3tmp.extend l1 4tmp.extend l2 5return tmp6 else 7 if l1 0 dell1 0 10else 11 12del...

求兩個矩形之間的最小距離

正在參與的工程裡有乙個小功能是求兩個矩形之間的最小距離。大致翻了一下opencv,貌似沒看到現成的函式,那就自己寫乙個好了。1 不相交,但在x或y軸方向上有部分重合座標,比如矩形1和2,此時,最小距離為兩個矩形之間的最小平行距離或垂直距離,如圖中紅色箭線d12所示。2 不相交,在x和y軸方向上均無重...