普遍思路:大家剛看到這道題的第一反應應該是遍歷逐個陣列找出最小值,這樣做當然可以解決這道題,但有個缺點就是時間複雜度為o(n),並且沒有用到題目給出的旋轉陣列的遞增特性。所以我們可以另闢蹊徑找到新方法
思路pro:我們可以根據陣列部分有序的特性使用二分查詢,相當於把陣列分為兩部分遞增序列,4,5為第一部分,後面的1,2,3為第二部分。然後設定兩個指標分別指向第乙個元素和最後乙個元素,再設定乙個變數儲存陣列中間值,然後分別與第乙個元素和第二個元素比較,如果第乙個元素比中間的那個數大,那麼說明最小值在第二部分,所以這時候把第乙個指標指向中間,另乙個指標不變,如果第乙個指標比中間值小,說明最小值在第一部分,這時候把第二個指標指向中間值。最終兩個指標會相鄰,相鄰時第二個指標的指向肯定就是最小值。這就是類似於二分查詢的解法。
**如下
#include#includeint special(int *arr,int a,int b);
int sort(int *arr,int n)
int start=0;
int end=n-1;
int mid;
while(arr[start]>=arr[end])
mid=(start+end)/2;
if(arr[start]==arr[end]==arr[mid])//針對例如10111這種特例,只能順序查詢
if(arr[start]>=arr[mid])
if(arr[start]}
return arr[end];
}int special(int *arr,int a,int b)//順序查詢
} return min;
}int main()
int*brr=null;
int m=sort(arr,n);
printf("最小值為%d",m);
delete arr;
}
劍指offer 面試題11 旋轉陣列的最小數字
完整 位址 把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個非遞減排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。例如陣列為的乙個旋轉,該陣列的最小值為1。note 給出的所有元素都大於0,若陣列大小為0,請返回0。這道題目相對前面的比較複雜,坑比較多 此時用二分法解決,mi...
劍指Offer面試題11 旋轉陣列的最小數字
把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個非減排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。例如陣列為的乙個旋轉,該陣列的最小值為1。note 給出的所有元素都大於0,若陣列大小為0,請返回0。牛客網ac class solution int left 0,right...
《劍指offer》面試題11 旋轉陣列的最小數字
題目 把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個遞增排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。例如,陣列為的乙個旋轉,該陣列的最小值為1。分析 我們注意到旋轉之後的陣列實際上可以劃分為兩個排序的子陣列,而且前面子陣列的元素都大於或者等於後面子陣列的元素。和二分查詢...