根據年份我給了噸收穫。
像{3,6,12,1,20,25}。
找到有序年份收穫之間收穫的最小差異。
對於給定示例差異是2,因爲3 - 1 = 2。保留順序和結果爲正數
排序不適用,因爲數字已根據年份排序。
一種方法是找到所有正面差異,選擇最小的一個。
但它需要O(n^2)。
有沒有更快的方法來做到這一點?
主要任務是找到數組中元素之間的最小差異,而不改變元素的順序,使它們的差異爲正。如何在不改變順序的情況下查找數組中兩個數字之間的最小差異,使它們的差異爲正數?
回答
根據我的問題的理解,我們需要計算min(a[i] - a[j])
所有有效i
中和j
這樣i < j
和a[i] > a[j]
。
可以在陣列上遍歷從左至右,並保持在能夠有效地支持insert
和upper_bound
操作的數據結構中的所有元件(例如,在C的std::set
++或Java中的TreeSet
)。
的僞代碼(C++等)可以是這樣的:
s = empty set
res = INF
for elem in array: // from left to right
if s.upper_bound(elem) != s.end(): // checks if there is a larger element
res = min(res, *s.upper_bound(elem) - elem)
s.insert(elem)
插入件和UPPER_BOUND操作花費時間O(log N)
,所以總的時間複雜度是O(N log N)
。
它的工作!我不知道那個treeSet保持元素排序。 –
你能解釋一下這個算法的工作原理嗎? – skrtbhtngr
@skrtbhtngr我認爲這是不言自明的。我們只是遍歷從左到右的所有元素,使用標準庫數據結構找到我們已經看過的最小元素大於給定元素的元素,並將新元素添加到此結構中。 – kraskevich
如果您比較每個值與其他每個值,它將是O(n^2)。 所以一個可能的答案可能是採取輔助數組中的值,將其排序爲O(n * ln(n)),然後在一次遍歷中找到最小連續差異。 我找不出一個O(n)解決方案。 (如果輸入數據有一些限制,可能會有一個)。
- 1. 查找兩個數組之間的最小差異
- 2. 數字之間的最小差異
- 3. 如何查找逗號分隔數組中兩個數字之間的差異?
- 4. 兩個數組之間的差異值
- 5. 陣列中兩個數字之間的最小絕對差異
- 6. 查找FSharp中兩個數組之間的差異
- 7. 找到bash中排序數組中數字的最小差異
- 8. PHP - 查找兩個數組的值之間的差異/減法
- 9. 數組之間的差異
- 10. 如何比較兩個數字的數字之間的差異?
- 11. 如何使用數組中的date_diff()查找兩個日期之間的差異
- 12. 如何找到兩個JavaScript對象數組之間的差異?
- 13. 查找兩個int數組之間的差異
- 14. 找到兩個整數數組之間的差異
- 15. 使用LINQ查找兩個數據對象之間的差異
- 16. 找出數組元素之間的最小差異
- 17. 如何平衡兩個數組之間的差異如何最小化?
- 18. 查詢找到兩個時間數據之間的差異
- 19. 如何找到Mysql中兩列之間的最小差異?
- 20. 如何在數組中找到兩個最接近的整數和數字之間的差異
- 21. 如何查找數組中有最小差異的兩個元素?
- 22. 如何查找兩列數據之間的差異?
- 23. 計算數組中兩個相鄰數字之間的最大差異
- 24. 查找兩個數據表之間的差異
- 25. 庫函數查找兩個列表之間的差異 - OCaml
- 26. Python - 查找兩個數據幀之間的行差異
- 27. SQL查找兩行之間的差異
- 28. 找到數組中所有值之間的差異,並檢查數組中存在的差異
- 29. 查找小時之間的差異
- 30. 如何在字符數組中找到兩次之間的差異?
我想你一定是誤解了「連續」這個詞。要麼你的描述不正確,要麼你的理解是錯誤的。 – ruakh
3和1在您的示例中不連續。問題是一致的。 – kraskevich
我會改進。 –