【劍指offer】旋轉陣列的最小值

蘭亭風雨發表於2014-05-08

轉載請註明出處: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
    採用二分查詢的策略,重點要考慮一些邊界情況:旋轉了0元素,即輸入的是一個升序排列的陣列、只包含一個數字的陣列、有很多重複數字的陣列等。

    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
****************************************************************/


相關文章