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

给定一个有序数组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;
  }


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值