您的位置:首页 > 其它

求一个值是否是一个给定有序数组中两个元素的和

2013-10-15 14:17 288 查看
给定一个有序数组a,长度为len,和一个数X,判断A数组里面是否存在两个数,他们的和为X,bool judge(int *a, int len, int x),存在返回true,不存在返回false

算法的思路通过上图可以清晰的表现出来,这里再简单叙述一下:申请一个与原数组a
一样长度的内存空间arr
,用给定的值X减去原数组中的元素,对应的放到申请的内存空间arr
中,设置两个指针p和q,分别指向原数组a
的最后一个元素和arr
的第一个元素,指针移动满足条件:

指针移动必须满足条件: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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐