我建議使用哈希。即使它是而不是你應該解決這個問題,值得一提的是,哈希算法具有更好的時間複雜度O(n)
v。O(n*log(n))
這就是爲什麼更高效。
- 打開
A
成HashSet的(或字典如果我們想i
指數) - O(n)
- 掃描
B
並檢查是否有在HashSet中的value - B[j]
(字典) - O(n)
所以你有一個O(n) + O(n) = O(n)
算法(這是更好需要(O n * log(n))
,然而,該解決方案是不分而治之):
樣品C#實現
int[] A = new int[] { 7, 9, 5, 3, 47, 89, 1 };
int[] B = new int[] { 5, 7, 3, 4, 21, 59, 0 };
int value = 106; // 47 + 59 = A[4] + B[5]
// Turn A into a dictionary: key = item's value; value = item's key
var dict = A
.Select((val, index) => new {
v = val,
i = index, })
.ToDictionary(item => item.v, item => item.i);
int i = -1;
int j = -1;
// Scan B array
for (int k = 0; k < B.Length; ++k) {
if (dict.TryGetValue(value - B[k], out i)) {
// Solution found: {i, j}
j = k;
// if you want any solution then break
break;
// scan further (comment out "break") if you want all pairs
}
}
Console.Write(j >= 0 ? $"{i} {j}" : "No solution");
你是怎麼試着解決這個問題的?你卡在哪裏? –
如果我們不使用分而治之(蠻力),這是非常容易的。但我不知道如何使用分治法來解決這個問題。我希望如果有人至少可以給我暗示 –
「如果存在不同的值I,J(即I = J 1)」:這是一個非常可疑的要求。由於元素是從不同的數組中抽取出來的,所以要求使用不同的索引是毫無意義的,而不同的值不是由i!= j表示,而是由A [i]!= B [j]表示。另一種解釋可能是「是否有不同的對,如......」。 –