转载请注明出处:http://blog.csdn.net/ns_code/article/details/25335043
如今对算法真的是由衷地热爱啊,总是忍不住想要A题(本科都没这意识,哎,把时间都浪费在了考试拿奖学金和所谓的学生工作上了),并且数学一直以来都是自己的强项,希望在这方面以后能应用好。尽管在ACM方面还仅仅是个小学生。以后即使工作了,也要把ACM坚持下去。无关乎工作,仅仅关乎兴趣。
依旧是剑指offer上的题目,第8题,在九度OJ上測试通过。
时间限制:1 秒
内存限制:32 兆
- 题目描写叙述:
把一个数组最開始的若干个元素搬到数组的末尾。我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。
比如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。
- 输入:
输入可能包括多个測试例子。对于每一个測试案例,
输入的第一行为一个整数n(1<= n<=1000000):代表旋转数组的元素个数。
输入的第二行包括n个整数。当中每一个整数a的范围是(1<=a<=10000000)。
- 输出:
相应每一个測试案例,
输出旋转数组中最小的元素。
- 例子输入:
53 4 5 1 2
- 例子输出:
1
AC代码:
#include<stdio.h> #include<stdlib.h> int main() { int n; while(scanf("%d",&n) != EOF) { int *A = (int *)malloc(n*sizeof(int)); if(A == NULL) exit(EXIT_FAILURE); int i; for(i=0;i<n;i++) scanf("%d",A+i); int p1 = 0; int p2 = n-1; int mid = p1; while(A[p1] >= A[p2]) { if(p2-p1 == 1) { mid = p2; break; } mid = (p1+p2)/2; //特殊情况,仅仅能顺序查找 if(A[p1]==A[mid] && A[p2]==A[mid]) { mid = p1; int i; for(i=p1+1;i<=p2;i++) { if(A[mid] > A[i]) mid = i; } break; } if(A[mid]>=A[p1]) p1 = mid; else if(A[mid]<=A[p2]) p2 = mid; } printf("%d ",A[mid]); free(A); A = 0; } return 0; }
/**************************************************************
Problem: 1386
User: mmc_maodun
Language: C
Result: Accepted
Time:700 ms
Memory:4820 kb
****************************************************************/