【劍指offer】旋轉陣列的最小值
阿新 • • 發佈:2019-01-07
現在對演算法真的是由衷地熱愛啊,總是忍不住想要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\n",A[mid]); free(A); A = 0; } return 0; }
/**************************************************************
Problem: 1386
User: mmc_maodun
Language: C
Result: Accepted
Time:700 ms
Memory:4820 kb
****************************************************************/