【发布时间】:2017-04-16 20:06:33
【问题描述】:
对于经典的二和问题,我有一个 O(n^2) 的解决方案。其中 A[1...n] 排序的正整数数组。 t 是某个正整数。
需要证明 A 包含两个不同的元素 a 和 b s.t。 a+ b = t
到目前为止,这是我的解决方案:
t = a number;
for (i=0; i<A.length; i++)
for each A[j]
if A[i] + A[j] == t
return true
return false
如何使它成为线性解决方案? O(n) 挠头想弄清楚。
到目前为止,这是我想到的一种方法。 i 将从 A 的开头开始,j 将从 A 的末尾开始。 i 将递增,j 将递减。所以我将在 for 循环中有两个计数器变量 i 和 j。
【问题讨论】:
-
到目前为止,您查找并尝试了什么?
-
如果数组已排序:在开头放一个指针,最后放一个指针。第一个前进,另一个后退。
-
A[i] 的可能范围是多少?
-
数组已排序,我只是添加了一种方法,使用两个计数器,一个向前,另一个向后。 A 的长度是任意的。比如说我们可以做 A[10]
-
如果我的 O(n^2) 在这里正确?