劍指offer面試題 旋轉陣列的最小數字。

2021-10-03 14:09:04 字數 951 閱讀 2937

普遍思路:大家剛看到這道題的第一反應應該是遍歷逐個陣列找出最小值,這樣做當然可以解決這道題,但有個缺點就是時間複雜度為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。分析 我們注意到旋轉之後的陣列實際上可以劃分為兩個排序的子陣列,而且前面子陣列的元素都大於或者等於後面子陣列的元素。和二分查詢...