相邻元素差的绝对值都是1,在这样的数组中找目标元素

今天看到这样一个题目:有一个数组 A,大小为 n, 相邻元素差的绝对值都是1。 如: A=

{4,5,6,5,6,7,8,9,10,9},现给定 A和目标整数 t,找出 t 在 A 中的位置。

类似题目还有:有一个 int 型数组,每两个相邻元素之间的差值不是 1 就是 -1,给定一个数,找出这个数在该数组中的位置。

【解法一】

对这个数组进行遍历,复杂度为 O(n)。如果数组长度很大的话,遍历不是一个很好的解决方法。但是有木有更好地方法呢?答案是肯定的。

【解法二】

利用当前位置的数与查找数的差来实现跨越式搜索。

数组第一个数为 A[0],要找的数是 X, 设 t = abs(X-A[0]),由于相邻两个数的绝对值为1.则第 t 个位置之前的数肯定都比 A小。重新计算 t , t = t+abs(X-A[0]),再重复上述步骤即可。

代码如下:

int FindNumberIndex(int A[],int n, int find_number)

{

   int next_index = abs(find_number-A[0]);

  while(next_index<n)

  {

      if (A[next_index] == find_number)

        return next_index;

      next_index += abs(find_number-A[next_index]);

  }

   return -1;

}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值