【剑指offer】旋转数组的最小值

来源:互联网 发布:c语言手册下载 编辑:程序博客网 时间:2024/05/16 04:24

 现在对算法真的是由衷地热爱啊,总是忍不住想要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
    采用二分查找的策略,重点要考虑一些边界情况:旋转了0元素,即输入的是一个升序排列的数组、只包含一个数字的数组、有很多重复数字的数组等。

    AC代码:

[cpp] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. #include<stdio.h>  
  2. #include<stdlib.h>  
  3.   
  4. int main()  
  5. {  
  6.     int n;  
  7.     while(scanf("%d",&n) != EOF)  
  8.     {  
  9.         int *A = (int *)malloc(n*sizeof(int));  
  10.         if(A == NULL)  
  11.             exit(EXIT_FAILURE);  
  12.         int i;  
  13.         for(i=0;i<n;i++)  
  14.             scanf("%d",A+i);  
  15.   
  16.         int p1 = 0;  
  17.         int p2 = n-1;  
  18.         int mid = p1;  
  19.         while(A[p1] >= A[p2])  
  20.         {  
  21.             if(p2-p1 == 1)  
  22.             {  
  23.                 mid = p2;  
  24.                 break;  
  25.             }  
  26.             mid = (p1+p2)/2;  
  27.             //特殊情况,只能顺序查找  
  28.             if(A[p1]==A[mid] && A[p2]==A[mid])  
  29.             {  
  30.                 mid = p1;  
  31.                 int i;  
  32.                 for(i=p1+1;i<=p2;i++)  
  33.                 {  
  34.                     if(A[mid] > A[i])  
  35.                         mid = i;  
  36.                 }  
  37.                 break;  
  38.             }  
  39.             if(A[mid]>=A[p1])  
  40.                 p1 = mid;  
  41.             else if(A[mid]<=A[p2])  
  42.                 p2 = mid;  
  43.         }  
  44.         printf("%d\n",A[mid]);  
  45.         free(A);  
  46.         A = 0;  
  47.     }  
  48.     return 0;  
  49. }  

/**************************************************************
    Problem: 1386
    User: mmc_maodun
    Language: C
    Result: Accepted
    Time:700 ms
    Memory:4820 kb
****************************************************************/


0 0
原创粉丝点击