首页 > 代码库 > 待字闺中之此起彼伏分析

待字闺中之此起彼伏分析

题目来源,待字闺中,原创@陈利人 ,欢迎大家继续关注微信公众账号“待字闺中” 

有这样一个数组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;
}