题目:
给定排好序的数组A,大小为n,现给定数X,判断A中是否存在两数之和等于X,请用C、C++或Java语言实现这一算法,要求速度越快越好。
解:
static Boolean Find(int[] arr, int sum)
{
// 对数组排序
Arrays.sort(arr, 0, arr.length);
int i = ( arr.length - 1 ) / 2;
int j = i + 1;
while ( ( i >= 0 ) && (j < arr.length))
{
// 找到
if(arr[i] + arr[j] == sum)
{
System.out.println(arr[i]+"+"+arr[j]+"="+sum);
return true;
}
else if(arr[i] + arr[j] > sum)
{
--i;
}
else // (arr[i] + arr[j] < sum)
{
++j;
}
}
// goes here
System.out.println("未找到! ");
return false;
}
小结:
1,时间复杂度为O(n);
2,采用先排序,从中间往两边找的顺序,如果和大了,则左边的数往左移;如果和小了,则右边的数往右移。