算法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 }
作者:justvi
出处:http://www.cnblogs.com/justvi/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章正文中给出原文连接,否则保留追究法律责任的权利
出处:http://www.cnblogs.com/justvi/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章正文中给出原文连接,否则保留追究法律责任的权利