求一个值是否是一个给定有序数组中两个元素的和
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;
}
算法的思路通过上图可以清晰的表现出来,这里再简单叙述一下:申请一个与原数组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;
}
相关文章推荐
- 给定一个值S,在有序数组中找出两个元素A和B,使 A+B = S.
- 给定一个值S,在有序数组中找出两个元素A和B,使 A+B = S.
- 程序员面试题目总结--数组(二)【二分查找、找出给定数字出现次数、两个有序整型数组交集、找出数组中唯一的重复元素、判断数组中的数值是否连续相邻】
- 给定一个有序数组,元素各不相同且升序排列,创建一个高度最小的二叉查找树
- merge两个有序数组 & 查找一个有序数组中指定元素
- 在一个循环有序数组里查找一个给定的值是否存在
- 将两个数组中的元素有序存入到一个链表中(C语言)
- 给定一个有序整数数组,元素各不相同且按照升序排列,编写一个算法,创建一个高度最小的二叉查找树
- 面试题:给定一个有序的数组,如果往该数组中存储一个元素,并保证这个数组还是有序的,那么元素的存储的角标位如何获取。
- 2.3-7 描述一个运行时间为Θ(nlgn)的算法,给定n个整数的集合S和另一个整数x,该算法能确定S中是否存在两个其和刚好为x的元素
- 已知一个矩阵 A(m*n) 的元素每行每列都按从小到大有序, 试设计一个算法判断任一给定值 k 是否在矩阵 A(m*n) 中
- 程序员面试金典: 9.4树与图 4.3给定一个有序整数数组,元素各不相同且按升序排列,创建一颗高度最小的二叉查找树。
- 描述一个运行时间为Θ(nlgn)的算法,给定n个整数的集合S和另一个整数x,该算法能确定S中是否存在两个其和刚好为x的元素
- 请教一个算法问题,有两个数组A,B,判断A中是否至少有一个元素和B中元素相同
- 给定一个数组input[] ,如果数组长度n为奇数,则将数组中最大的元素放到 output[] 数组 最中间的位置,如果数组长度n为偶数,则将数组中最大的元素放到 output[] 数组中间两个位置偏右的那个位置上
- 给定一个数组,判断这个数组的元素是否是在一个序列
- 给定一个整数sum, 从有N个有序元素的数组中寻找元素a,b,使得a+b的结果最接近sum
- 给定一个有序的数组,元素各不相同且按升序排列,编写一个算法,创建一棵高度最小的二叉查找树?
- T.array.contains判断一个数组中是否包含给定元素
- 题目1.请给出一个运行时间为O(nlgn)的算法,使之能在给定一个由n个整数构成的集合S和另一个证书x时,判断出S中是否存在有两个其和等于x的元素。