这是我在某处看到的一个面试问题,并提出了这个问题:
import java.util.Random;
import java.util.Arrays;
class SumTwo
{
public static void main(String arg[])
{
Random r=new Random();
int arr[]=new int[5];
for(int i=0;i<arr.length;i++)
{
arr[i]=r.nextInt(20);
}
Arrays.sort(arr);
printArr(arr);
System.out.println(checkSum(arr));
}
public static boolean checkSum(int[] arr)
{
for(int i=2;i<arr.length;i++)
{
if(check(arr,0,i-1,arr[i]))
return true;
}
return false;
}
public static boolean check(int[] arr, int st, int en, int sum)
{
int add=0;
while(st<en)
{
add=arr[st]+arr[en];
if(add==sum)
return true;
else if(add>sum)
en--;
else
st++;
}
return false;
}
public static void printArr(int[] arr)
{
System.out.println("\n");
for(int i=0;i<arr.length;i++)
System.out.print(" "+arr[i]);
System.out.println("\n");
}
}
答案 0 :(得分:2)
嗯,你的是O(n ^ 3)。 (编辑:我误读了,你是对的,你的是O(n ^ 2))就像Louis Wasserman说的那样,有一个简单的O(n ^ 2 log n)算法,这里有一个用于O(n ^ 2)使用一点额外的记忆:
public static boolean checkSum(int[] arr) {
HashSet<Integer> set = new HashSet<Integer>();
for (int n : arr) {
set.add(n);
}
for (int i = 0; i < arr.length; i++) {
for (int j = i + 1; j < arr.length; j++) {
if (set.contains(arr[i] + arr[j])) return true;
}
}
return false;
}
根据问题的定义,可能需要一个包含零的数组的特殊情况,但这个想法就在那里。
直观地说,似乎可能有一种聪明的方式来做O(n log n)左右,但是我无法立即找到任何东西。我会继续思考它,这是一个很好的问题。