给定两个排序的整数数组a
和b
,以及整数c
,我必须找到i,j
这样:
a[i] + b[j] <= c
且a[i] + b[j]
尽可能大。
我能想到的最佳解决方案是在 O ( n log n )时间内,从第一个数组获取每个整数并找到“c-a[i]
”的下限
任何人都可以建议我更好的方法(可能在O( n )时间)?
答案 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);
}
}