此起彼伏分析
原题
有这样一个数组A,大小为n,相邻元素差的绝对值都是1.如:A={4,5,6,5,6,7,8,9,10,9}。现在,给定A和目标整数t,请找到t在A中的位置。除了依次遍历,还有更好的方法么?
现在我们来看看今天的题目,今天的题目,最直接的就是遍历,访问每一个元素,并且进行比较。这是任何一个、没有任何特点的数组,都可以采用的方法。也就是,相邻元素差的绝对值,我们没有使用。
那么如何来利用这个特点呢?看下面的数组:
2 | 3 | 4 | 5 | 6 | 5 | 4 | 5 | 6 | 7 | 8 |
如果,我们要找到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。
总结下算法过程:
-
当前元素与t比较,差为0,则找到;
-
否则,得到差值为k,指针跳到当前元素后的第k个元素。
-
重复这两步,直到找到t或者t不在数组中。
【分析完毕】
注:我觉得在第2步得到差值k,应该取k的绝对值。指针跳到当前元素的第|k|个元素后,
如数组为:87654565432当查找2时,第一步2-8=-6,这时应该取绝对值|-6|=6即与后面第6个元素进行比较。依次类推。