两个排序数组中最近的对总和

时间:2012-06-27 10:45:11

标签: c arrays algorithm

给定两个排序的整数数组ab,以及整数c,我必须找到i,j这样:

a[i] + b[j] <= c

a[i] + b[j]尽可能大。

我能想到的最佳解决方案是在 O n log n )时间内,从第一个数组获取每个整数并找到“c-a[i]”的下限 任何人都可以建议我更好的方法(可能在O( n )时间)?

3 个答案:

答案 0 :(得分:6)

想一想,然后你可以问自己:
“每次都有必要在排序的b阵列中搜索来自[]的连续值吗?”

答案 1 :(得分:2)

我认为你下次不必搜索整个数组b [] ......你必须在数组b的开始和到目前为止找到的最低限度之间进行搜索....在[]中的元素。它肯定会减少你的时间复杂度......当你找到给定目标'c'时,你必须停止搜索。

答案 2 :(得分:0)

以下解决方案是线性时间复杂度O(n),空间复杂度O(1)

public class ClosestPair {

    public static void main(String[] args)
    {
        int ar2[] = {4, 5, 7};
        int ar1[] = {10, 20, 30, 40};
        int x = 10 ;
        closest(ar1,ar2,x);
    }
    public static void closest(int[] ar1, int[] ar2, int x)
    {   int diff=Integer.MAX_VALUE;
        int first_num=0;
        int second_num=0;
        int second_diff=Integer.MAX_VALUE;
        for(int i=0; i<ar1.length; i++)
        {
            if(x==ar1[i] )
            {
                System.out.println("no pair possible");
                return;
            }
        }
        for(int i=0; i<ar2.length; i++)
        {
            if(x==ar2[i])
            {
                System.out.println("no pair possible");
                return;
            }
        }
        for(int i=0; i<ar2.length; i++)
        {

            if(Math.abs(x-ar2[i])<=diff)
            {
                diff=Math.abs(x-ar2[i]);
                first_num=ar2[i];
            }
        }
       diff=x-first_num;
       for(int i=0; i<ar1.length; i++)
       {
           if(Math.abs(diff-ar1[i])<=second_diff)
           {
               second_diff= Math.abs(diff-ar1[i]);
               second_num= ar1[i];
           }
       }
       System.out.println(first_num + " "+ second_num);
    }
}