查找绝对值等差数列

不晓得题目是否合适,百度的笔试中有这样一道题目:一个数列,相邻元素差值的绝对值为1,比如4323456543,现在在这个数列中查找一个数字,如果找到,打印该数字位置,没有找到,则打印not found。

在序列中查找元素,如果序列有序,可以采用折半查找等方法,只与数列的规模N有关系,但因为数列摆动,比如3,出现在3个位置,所以不能缩小查找的规模,只能遍历完整个数组。所以最基本的想法是从头至尾便利序列,如果找到3,打印当前位置,数组遍历完后,没有找到就输出相应的信息。这样复杂度为O(n),需要n次比较。

这只是最基本的查找,我们没有用到差的绝对值为1这个条件,利用这个条件恰恰可以决定一个步进,就不用按照每次步进1去扫描数列了。

如果第一个元素值为x,需要查找的元素为y,我们定义x、y之间的距离为d = |y-x|;而绝对值本身就是距离,也就是说,该数列相邻的元素距离为1,那如果查找元素和第一个元素之间的距离为d,那么待查找元素(如果有存在)至少应该在d的位置处(x的位置为0,这是最好情况,即数列递增或者递减),或者更远(数列摆动),所以我们从0位置直接跳到d处,然后以d处的元素为基准,重新计算y和a[d]的距离,进一步选择跳跃步进,若相等,则找到第一个。

找到第一个后,现在距离为0,因为后面还可能再次出现y,那么,分析可知,如果后面有y出现,最近的位置应该是当前位

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值