《劍指offer》 面試題八 旋轉陣列的最小數字

2021-08-17 12:23:11 字數 2050 閱讀 4110

面試題八:旋轉陣列的最小數字

演算法的考察也是面試的一大重點,所以對於二分查詢、歸併查詢、快速排序這幾個經常考的,也是要記得滾瓜爛熟。

在寫**的時候,有很多演算法都會用到迴圈和遞迴這兩種不同的方法實現,通常遞迴的實現方式是比較簡單,**比較簡潔,但是它的缺點就是在效率方面不如用迴圈來實現

**。所以在面試官沒有具體的要求的時候,我們可以用遞迴,但是如果對**的整體的效率方面進行考慮的話,盡量不要使用遞迴。

面試題八:旋轉陣列的最小數字;

題目:

把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個遞增

排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。例如陣列為的乙個 旋轉,該陣列的最小值為1。

分析:第一種就是從尾到頭遍歷整個陣列,時間複雜度為o(n)也是直接可以想到的一種方法,但是題目中給出你旋轉陣列的定義,就不可能直接讓你去想到解決掉,畢竟面試也是對人才的一種篩選。所以我們從另一種角度去思考問題,一開始是有序的乙個陣列,那麼經過旋轉,我們就會發現原本的乙個陣列相當於拆成了兩個有序的陣列,但是原本的特性有序並沒有發生改變,我們這裡說的特性沒有改變是指旋轉後的"兩個陣列",所以我們可以找到兩個陣列的交接點,就是臨界點,不難發現是1,那麼我們怎麼從乙個陣列的角度去思考兩個陣列的問題呢,首先,乙個陣列從前想後是下標進行移動,那麼使乙個陣列可以想象成兩個陣列,所以我們就使用兩個「下標」,也就是兩個"指標",p1和p2,p1從下標0(第乙個元素)開始,p2從尾部(最後乙個元素)開始,並且由於是「旋轉」得到,所以一般情況左邊的陣列會大於等於右邊的陣列,這樣我們就可以利用二分查詢的特性進行解決了,接著我們找到陣列中的中間元素,使p1下標所對應的元素與中間元素進行比較,如果中間元素大於p1,說明在「左邊陣列中」,所以,我們直接把p1跳到中間元素的位置上,同樣的當中間元素與p2進行比較的時候,由於p2是從後向前與原陣列的有序相反,所以利用這特效,當中間元素小於p2的時候說明,中間元素在「右邊的陣列」中,所以p2跳到中間元素的位置上。所以這樣,一步一步的就會使範圍不斷縮小,也就是所謂的二分查詢演算法原理。

所以時間複雜度為o(logn),特殊情況為o(n),比如陣列為旋轉得到陣列和;這時候我們計算就會發現p1所對的和p2還有中間元素相等,所以就會使兩個指標p1和p2不知道怎麼移動,所以對於這種特殊情況只能順序查詢了,也就是時間複雜度為o(n)。

**實現:

#include #include using namespace std;

int find_min_number(int *num, int len)

index_mid = (index_left+index_right) / 2;

if (num[index_left] == num[index_right] && num[index_right] == num[index_mid])

}index_mid = index_left;

break;

} if (num[index_left] <= num[index_mid])

else if(num[index_right] >= num[index_mid])

}return num[index_mid];

}int main()

; cout<

//輸入的陣列是公升序排序陣列的乙個旋轉,陣列有重複數字;

int num2[6] = ;

cout<

//輸入的陣列是乙個公升序排序的陣列;

int num3[6] = ;

cout<

//輸入的陣列只包含乙個數字;

int num4[1] = ;

cout<

//特殊輸入測試(null指標)

int *num5 = null;

cout<

return 0;

}

劍指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。分析 我們注意到旋轉之後的陣列實際上可以劃分為兩個排序的子陣列,而且前面子陣列的元素都大於或者等於後面子陣列的元素。和二分查詢...