问题描述:给出int数组A,其中相邻的元素相差+1或-1,即类似{4,5,6,5,6,7,8,7,8,9},给出数t,找到t在A中的位置
备注: 百度2014笔试算法第二题
思路一:
“硬找”:遍历数组,找到即返回,O(n)
思路二:
“跳跳法”:先计算t与A[0]的差值,记为d,最好的情况下(0号位置后都相差+1),从0号位置向后走d步即可找到t,所以依次遍历每个位置,若后一个位置比前一个位置大1,则按照最理想情况,至少经过d步就能找到,故向前跨d步;若后一个位置比前一个位置小1,则为了找到t,首先需要花一步回到上一个位置所存储的值,还需要最好情况下走d步才能找到t,所以下一步跨(1+d)个位置。跨完后要重新计算d=t-A[i],由于每次都按照最理想情况向前跨步,故d>=0。
int findNum1(int* a, int t, int N)
{
if(NULL == a || N < 1)
return -1;
int i = 0;
int d = t - a[i];
int numOfLoop = 0;
while(i < N - 1 && d > 0)
{
++numOfLoop;
if(a[i] < a[i+1])
i += d;
else
i += (1 + d);
d = t - a[i];
}
cout << numOfLoop <<endl;
return i;
}