题目来源,待字闺中,原创@陈利人 ,欢迎大家继续关注微信公众账号“待字闺中”
有这样一个数组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。具体代码如下:
int findNum(vector<int>& data,int num) { int length = data.size(); int i = 0; while(i < length) { if(data[i] == num)return i; int distance = abs(data[i] - num); i += distance;//跳转到距离为distance的元素 } return -1; }
原文地址:http://blog.csdn.net/fangjian1204/article/details/38267499