找到给定排序数组中的任何两个数字是否与数组中的任何第三个相加的最有效方法是什么?

时间:2012-12-10 22:21:03

标签: java algorithm

这是我在某处看到的一个面试问题,并提出了这个问题:

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");
    }
}

1 个答案:

答案 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)左右,但是我无法立即找到任何东西。我会继续思考它,这是一个很好的问题。