昨天我接到了這個問題的任務,從那時起我就試圖找到一個有效的解決方案。
解決方案的細節是:給定兩個數組a [n],b [n],找到一個對(a [i],b [j]),以便abs(a [i] + b [j])儘可能小。這兩個數組由整數元素組成,不超過10億,這裏n至多爲10000.
我知道一個由兩個for循環組成的解決方案是不實用的,因爲數組的大小小於或等於10000.
I我正在考慮一種解決方案,我將以某種方式對這些元素進行排序,這是我尚未發現的,因此我們可以很容易地找出絕對值最小的和,因爲我的課正在學習排序算法。
你能幫我弄清楚這裏的方式嗎?
PS:對不起,我無法在這裏輸入數學符號。給定兩個相同大小的數組,找到兩個數組中的幾個元素,它們與最小的絕對值進行求和
回答
我有一個Python
代碼,在O(nlogn + mlogm) + O(m+n)
= O(nlogn + mlogm)
時間,其中n
是第一陣列的長度和m
是所述第二陣列的長度解決該問題。下面是代碼:
arr1.sort()
arr2.sort(reverse = True)
n = len(arr1)
m = len(arr2)
print arr1
print arr2
minim = abs(arr1[0] + arr2[0])
i = 0
j = 0
while i<n and j<m:
minimum = abs(arr1[i] + arr2[j])
minim = min(minim,minimum)
if arr1[i]>0 and arr2[j]>0:
j += 1
elif arr1[i]<=0 and arr2[j]<=0:
i += 1
elif arr1[i]>0 and arr2[j]<=0:
if abs(arr1[i]) > abs(arr2[j]):
j += 1
else:
i += 1
elif arr1[i]<=0 and arr2[j]>0:
if abs(arr1[i]) > abs(arr2[j]):
i += 1
else:
j += 1
print minim
實施例:
arr1[] = [-23, -10, 30, 44, 45]
arr2[] = [61, 55, 32, 22, -55]
答案:1
您可以否定其中一個列表並將其與其他列表一起排序。在這個新的列表中,您可以查找兩個連續的最小距離的條目,並且這兩個條目是每個原始列表中的一個條目。
如果a[i], i=0,1,...,n
是第一個,而b[j], j=0,1,...,n
是第二個,那麼min(|a[k]+b[l]|)=min(|a[k]-(-b[l])|)
。因此,對於某些k,l
,我們可以將a[k]
和b[l]
的總和最小化,而對於某些k,l
,我們可以最小化a[k]
和-b[l]
之間的差異。所以我們尋找一對a[k]
,-b[l]
儘可能接近。這樣的一對必須在從對i,j=0,1,...,n
進行排序a[i], -b[j]
獲得的列表中連續成爲長度爲2n
的單個列表c[t]
。
排序c
是O(n日誌n),運行通過c
是O(n),所以運行時間是由排序占主導地位。
如果沒有連續的數字出現,那麼其中一個數字來自array1,另一個來自數組2? –
@User_Targaryen這不可能發生,因爲組合列表是線性排序的。如果從排序array1和-array2獲得的組合列表array3中的最小條目來自他的第一個數組,則-array2中的最小條目必須出現在某個索引i> 0處。然後array3 [i-1]和array3 [i]是一對連續的條目,一個來自array1,一個來自array2。一個類似的參數工作它是array3中最小的條目來自-array2。然而,這一對並不一定是距離最近的那一對。 – asp
設'a = [1,2,3,4,5]'和'b = [6,7,8]',所以最終答案= 1。通過你的方法,你的第三個數組看起來像'[-8 ,-7,-6,1,2,3,4,5]'。現在,你如何通過你的方法找到答案爲'1'?請解釋 –
- 1. 兩個數組中最大的元素
- 2. 將一個數組劃分爲兩個相等大小的子集,它們的總和差值最小
- 3. 按升序合併兩個數組(兩個數組的大小相同)
- 4. 查找包含多個數組中最大/最小值元素的數組?
- 5. 找到不同行中的兩個單元格的最小值
- 6. 在兩個不同大小的數組中尋找共同元素
- 7. 如何交換兩個數組的成員,使兩個數組的元素總和的差值最小?
- 8. 如何找到一個數組的最大值和最小值
- 9. 在MIPS中查找10個元素數組的最大值和最小值
- 10. 找到兩個不同大小的數組
- 11. 分而治之 - 在包含獨特元素的兩個相同大小的數組之間找到中值?
- 12. 查找兩個JavaScript數組中的元素並將它們自己的數組存儲到每個數組中
- 13. 匹配兩個numpy數組以找到相同的元素
- 14. C++從兩個相同大小的不同整數數組中求最小商數
- 15. 找到一個數組的最小值
- 16. 查找數組中的最小元素,它有一個模式
- 17. 在大小爲N的數組的每k個元素中查找最小元素和第二小元素
- 18. 從數組中刪除任何一個元素後,將奇數大小的數組分成兩組相等大小和相同的總和
- 19. 查找數組中兩個最小值的索引
- 20. 在數組中找到兩個相鄰數之間的最小數字
- 21. 我必須找到沒有數組的兩個最小數字
- 22. 來自兩個不同大小數組的Ruby數組?
- 23. 查找給定數組中的兩個重複元素
- 24. 給定數組中2個元素之間的最小距離
- 25. 從兩個具有相同值的數組中提取元素
- 26. 我可以使用每兩個相同大小的數組
- 27. 比較兩個相同大小的diff數組
- 28. 如何在給定的時間複雜度python中找到兩個數組中的最小元素
- 29. 以相同的大小劃分數組,使給定函數的值最小
- 30. 使用HashMap查找兩個相等大小的數組中的相似元素的計數
我假定的元素是整數? – Adam
您是否需要找到總和最小的兩個元素?這就是我的理解。 –
是不是隻是min(array_1)+ min(array_2)? –