经典的2sum问题很简单而且众所周知:
你有一个未排序的数组,并且你得到一个值S.找到数组中所有元素对,它们加起来是值S.
并且总是说这可以通过在O(N)
时间和时间使用HashTable来解决。空间复杂度或O(NlogN)
时间和O(1)
空间复杂度,首先对其进行排序,然后从左右移动,
这两个解决方案显然是正确的但我猜不适用于以下数组:
{1,1,1,1,1,1,1,1}
是否可以在O(N)
或O(NlogN)
时间复杂度中打印此数组中最多为2的所有对?
答案 0 :(得分:5)
不,打印出所有对(包括重复项)需O(N2)
。原因是因为输出大小为O(N2)
,因此运行时间不能小于(因为在输出中打印每个元素需要一些恒定的时间,因此只需打印输出就需要{{ 1}}时间)。
如果所有元素都相同,例如CN2 = O(N2)
,每个可能的对都在输出中:
{1,1,1,1,1}
这是1. 1 1
2. 1 1
3. 1 1
4. 1 1
5. 1 1
6. 1 1
7. 1 1
8. 1 1
9. 1 1
10. 1 1
(通过将每个元素都包含在右侧的所有元素),即为
N-1 + N-2 + ... + 2 + 1
,超过N(N-1)/2 = O(N2)
或O(N)
。
但是,您应该能够计算预期O(N log N)
中的对数:
创建一个哈希映射O(N)
,将每个元素映射到它出现频率的计数。
循环哈希映射并求和,对于每个元素map
一直到x
(如果我们上升到S/2
,我们将包括{{1} }和S
两次,如果地图中不存在x
,请S-x
:
map[x] == 0
如果x
(选择map[x]*map[S-x]
和x != S-x
的方式数量x
if S-x
(来自map[x]*(map[x]-1)/2
以上)。当然,您也可以打印x == S-x
中的不同对,方法是创建类似于上面的哈希图并循环遍历它,只输出N(N-1)/2
和{ {1}} O(N)
存在的值。
答案 1 :(得分:1)
显示或存储结果仅为O(N 2 )。由您强调的最坏情况显然有N 2 对并将它们写入屏幕或将它们存储到结果数组中显然需要至少那么多时间。简而言之,你是对的!
答案 2 :(得分:0)
没有
您可以使用排序在 O(nlogn)中预先计算它们,但要打印它们,您可能需要的不仅仅是 O(nlogn)。在最坏的情况下它可以是 O(N ^ 2)。 让我们修改算法以找到所有重复的对。
举个例子:
a[ ]={ 2 , 4 , 3 , 2 , 9 , 3 , 3 } and sum =6
排序后:
a[ ] = { 2 , 2 , 3 , 3 , 3 , 4 , 9 }
假设您找到了对{2,4},现在您必须找到2和4的计数并将它们相乘以得不到重复对。其中2次出现2次,1次出现1次.Hence {2,1}在输出中将出现2 * 1 = 2次。现在考虑特殊情况,当两个数字相同然后计数没有出现并且平均它们.Here {3,3}总和为6.数组中3的出现是3.Hence {3 ,3}将在输出中出现9次。
在你的数组{1,1,1,1,1}中,只有对{1,1}总和为2,计数为1为5.因此,有5 ^ 2 = 25对{1, 1}在输出中。