假设我有一个列表[1,2,3,4,4]
和一个目标5
。我需要找到列表中总和为5的所有对,即(1,4),(1,4),(2,3)
。有人可以建议我一个算法如何在不到O(n^2)
的时间内解决它。
我在准备面试的过程中提出了这个问题,但我无法在O(n^2)
以内解决问题。
感谢任何帮助
答案 0 :(得分:0)
好吧,让我展示想法,你实现吧,好吗?
第一阶段。创建一个字典(地图),其中key = number
,value = number's occurrencies
。例如。对于[1, 2, 3, 4, 4]
,我们应该
{1, 1}, // we have exactly one 1
{2, 1}, // - / - 2
{3, 1}, // - / - 3
{4, 2} // we have two 4's
您可以在线性时间 O(N)
中创建这样的词典。
第二阶段。扫描数组,查看item
的每个key = 5 - item
字典并重复
(item, 5 - item)
对value
次。例如。对于[1,2,3,4,4]
,我们会有
item | key | value | output
-----------------------------------
1 | 4 | 2 | (1, 4), (1, 4)
2 | 3 | 1 | (2, 3)
3 | 2 | 1 | (3, 2)
4 | 1 | 1 | (4, 1)
4 | 1 | 1 | (4, 1)
如您所见,第二阶段也是O(N)