给定一个有序数组a,长度为len,和一个数X,判断A数组里面是否存在两个数,他们的和为X,bool judge(int *a, int len, int x),存在返回true,不存在返回false
算法的思路通过上图可以清晰的表现出来,这里再简单叙述一下:申请一个与原数组a[N]一样长度的内存空间arr[N],用给定的值X减去原数组中的元素,对应的放到申请的内存空间arr[N]中,设置两个指针p和q,分别指向原数组a[N]的最后一个元素和arr[N]的第一个元素,指针移动满足条件:
指针移动必须满足条件:p和q指针没有越界,越界则跳出
若指针指向的值相等且i不等于j(添加了条件:i不等于j,避免出现8 = 4 + 4的情况),则返回true;
若原数组是升序的,那么每次移动指向的值较大的指针;
若原数组是降序的,那么每次移动指向的值较小的指针;
移动结束,跳出移动指针的循环,说明不存在,返回false
这道题目其实可以不用那么复杂,这个算法使用了O(N)的空间,另一个较好算法是:设置两个指针,指向首尾的位置,指向的值分别为a,b,判断a + b 与x的大小关系来移动指针,当a + b > x时,移动a,b中较大值的指针;当a + b = x时,返回true;当a + b < x时,移动a,b中较小值的指针!
上述是一些别人写的题目要求和算法实现,一下是个人用php来实现的
function judgeDataIsInArr($x){
$arr = array(1,2,3,4,5,6,8,9,10,23,25);
//判断这个数组是升序还是降序
//$arr = array(10,9,8,7,6,5,4,3,2,1);//升序和降序的数组都测试过
$flag = false;//默认升序
if($arr[0] > $arr[1]) $flag = true ;
$first_index = 0;
$last_index = count($arr) - 1;
while($first_index < $last_index){
if($arr[$first_index]+ $arr[$last_index]== $x) return true;
elseif($arr[$first_index] + $arr[$last_index]<$x) {
if(!$flag)
$first_index++;
else
$last_index--;
}
else{
if(!$flag)
$last_index--;
else
$first_index++;
}
echo $first_index,',',$last_index,"\r\n";
}
echo $first_index,',',$last_index,"\r\n";
return false;
}