代码改变世界

算法100题48

2011-09-16 12:59  justvi  阅读(201)  评论(0编辑  收藏  举报

/* 题目来自:http://blog.csdn.net/v_JULY_v

 * 一个数组由一个递减数列左移若干位形成,如{4, 3, 2, 1,6,5}由{6,5,4,3,2,1}左移两位而成在这种数组中查找某一个数

 * 方法1:遍历数组查找次数,O(n)

 * 方法2:----------------------

 * 设原数列为:a0,...,an,移位后形成的数列为:b0,...,bn,

 * 且有ai=bj,则满足j=(i+len-m)%len    (m为移位位数)

 * 要求得某数位置,可先求得次数在原数列中的位置再按上面公式计算而来。

 * 可以先求出数列中的最大值,已知数列长度及递减步长,则可以求得在原数列中的位置

 * 求最大数:

 * 1.先求步长,设为t

 * t = b[1] - b[0] if b1<b0

 * t = b[0] - b[len-1] if b1>b0

 * 2.设b为按照b[0]为起始数,步长为t,长度为len的数列的最后一个数,则:

 * b = b[0] + (len - 1) * t

 *  则数列中最大的数 max = b[len-1] - b

 *  求数x在原数组中的位置:p = (x - max) / t

 * -----------------------*/

 1 //求得步长
2 int step(int *a, int len)
3 {
4 int t;
5 if (a[0] > a[1])
6 t = a[1] - a[0];
7 if (a[0] < a[1])
8 t = a[0] - a[len-1];
9 return t;
10 }
11
12 int find(int *a, int len, int x, int step)
13 {
14 int b, max, p, pr, m;
15
16 b = a[0] + (len - 1) * step;
17 max = a[len-1] - b;
18 p = (x - max) / step; //原位置
19 m = (a[0] - max) / step; //移位位数
20
21 pr = (p + len - m) % len;
22 return pr;
23 }
24
25 int main()
26 {
27 int arr[] = {4, 3, 2, 1, 6, 5};
28 int len = sizeof(arr) / sizeof(int);
29 int p = find(arr, len, 1, step(arr, len));
30 printf("%d\n", p);
31
32 return 0;
33 }