面试题之此起彼伏

此起彼伏分析

原题

有这样一个数组A,大小为n,相邻元素差的绝对值都是1.如:A={4,5,6,5,6,7,8,9,10,9}。现在,给定A和目标整数t,请找到t在A中的位置。除了依次遍历,还有更好的方法么?


现在我们来看看今天的题目,今天的题目,最直接的就是遍历,访问每一个元素,并且进行比较。这是任何一个、没有任何特点的数组,都可以采用的方法。也就是,相邻元素差的绝对值,我们没有使用。

那么如何来利用这个特点呢?看下面的数组:

23456545678

如果,我们要找到t=8,则按照如下步骤进行,指针初始指向第一个元素

  • 与第一个元素2比较,差值为6,指针指向第6元素,

  • 当前元素为4,与8比较,差值为4,指针指向第10元素

  • 当前位置为8,找到元素。

为什么可以直接跳跃指到到第6,或者第10个元素呢?原因就是,相邻元素的差的绝对值都是1.这样,针对第一步来说,当前值2与t=8相差6,如果t在数组中存在,则一定在2的后面第6个以后,而且,只有当2的后面,每一个都是+1的时候,才会在第6个位置找到t。其他的情况,一定都小于t。

总结下算法过程:

  1. 当前元素与t比较,差为0,则找到;

  2. 否则,得到差值为k,指针跳到当前元素后的第k个元素。

  3. 重复这两步,直到找到t或者t不在数组中。

【分析完毕】

注:我觉得在第2步得到差值k,应该取k的绝对值。指针跳到当前元素的第|k|个元素后,

        如数组为:87654565432当查找2时,第一步2-8=-6,这时应该取绝对值|-6|=6即与后面第6个元素进行比较。依次类推。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值