我想通過蠻力(O(N^3)或遞歸協調算法)找到「唯一」三角形的最大數目(每個數組元素只能使用一次) )。應該採取什麼方法?數組中給定雙方的唯一三角形的數量
0
A
回答
0
創建一個映射(hashmap應該沒問題),並將終點映射到side。所以每一方都會有兩個條目 - 每個端點一個。現在,您可以高效地查找從任何給定終點開始的所有方面。
一些基本的僞代碼:
// map[X] is all unused sides with X as end-point
// markAsUsed should also remove the side from the map
// markAsUnused should also add the side to the map
// initial function call for any unused side
backTrackFunction(anyUnusedSide)
backTrackFunction(side AB)
if map.isEmpty
Found a solution.
markAsUsed(AB)
for each side AC in map[A]
if map[C].contains(CB)
// AB, CB and AC form a triangle
markAsUsed(CB)
markAsUsed(AC)
backTrackFunction(anyUnusedSide)
// Backtrack
markAsUnused(CB)
markAsUnused(AC)
上面可能有一些問題,但它只是打算成爲一個起點。
1
首先假定所有邊都具有正整數的長度。 (對於實數,間隔半開放半封閉的並使其梅西耶來思考。)
基本上,如果我們發現得到與長邊的數量範圍[a,b]
的一個有效途徑每0<=a<=b
,我們可以處理它:
edgeList = sort edgeList by length ascending order
foreach (edge1 in edgeList)
foreach (edge2 in edgeList where [edge2 >= edge1])
answer = answer + count_edge_number (edge2 , edge1+edge2-1);
return answer;
因此,我們只需要這樣的方式。要做到這一點,您只需按升序對邊進行排序,使用二進制搜索索引(訂閱)的間隔的下限和上限。 (也就是說,對於任何[a,b]
,請使用二分查找找到帶有element[i]<a
的最大i
和帶element[j]<=b
的最小j
)。這適用於O(logN)
。
因此你的任務可以在O(N^2LogN)
中實現,比稻草人O(N^3)
好得多。
相關問題
- 1. 給定一組三角形的長度,找到最大面積三角形
- 2. C中頂點的三角形數量
- 3. 三維delaunay三角測量與給定的一組點
- 4. 三角形的方形數字java
- 5. 給出一個數組,它將返回給定數組中的唯一數字
- 6. 包含點的三角形數量(0,0)
- 7. 在GDI +中繪製一個三角形給定一個矩形
- 8. 計算謝爾賓斯基三角形中三角形的數量
- 9. 測量數組中的唯一數字
- 10. 檢查一個正方形的哪個三角形是給定的座標
- 11. 三角形的方向(三角形指向的地方)
- 12. 數字的三角形
- 13. 三角形中的三角形CSS
- 14. 在三角形的三角形中繪製三角形
- 15. 找到一個三角形,正方形和圓形下的整數點數
- 16. 三角數組
- 17. numpy數組爲三角形(矩陣)
- 18. 在一個三角形的等距網格中,哪個三角形是給定的點?
- 19. 在C++中的複數的三角函數和雙曲函數
- 20. 在prolog中做三角形的數字
- 21. RenderScript中的最大三角形數
- 22. java中的三角形數字
- 23. python中的三角形數字
- 24. 從「三角形湯」中找到唯一的頂點
- 25. 查找給定區域的直角三角形的邊界
- 26. openGL drawElements - 一個額外的三角形,使用索引數組?
- 27. C - 給定兩個數組,你如何找到一個數組中唯一元素的數量?
- 28. 給定一個整數數組,找出數組中第三大的值
- 29. 獲取三角形內的三角形?
- 30. OpenCL中常量數組初始值設定項中的三角函數
就目前而言,我不認爲這個問題中有足夠的信息可供任何人回答。你能否進一步解釋,告訴我們你已經嘗試了什麼,以及你遇到的任何具體問題。你想用什麼語言來做這件事? –
我正在用C++做。我應該補充說三角形應該是有效的。 – mehmetin
陣列中給出了邊長。需要構成有效三角形的三元組的最大數量。 (a <(b + c)&& b <(a + c)&& c <(a + b))。每邊的長度只能使用一次,即三角形的邊應該是不相交的。如果有重複的邊長,相同的邊長可以多次使用。 – mehmetin