劍指Offer8題(旋轉陣列的最小數字)

2021-09-29 09:37:22 字數 1505 閱讀 7541

(本部落格旨在個人總結回顧)

題目描述:

把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個遞增排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。例如陣列為的乙個旋轉,該陣列的最小值為1。

分析:

①從頭遍歷就可以得到最小值,時間複雜度為o(n),而題目給的資訊就根本沒用到,肯定滿足不了面試官 ·~_~||

②在演算法的面試小提示,這題可以嘗試使用二分查詢去解決。

// offermemo8.cpp : 定義控制台應用程式的入口點。

//#include "stdafx.h"

#include using namespace std;

/* * @name findmin

* @brief 二分法查詢陣列最小值

* @param [in] int * parray 有序遞增陣列的旋轉陣列

* @param [in] int nlength 陣列長度

* @param [in] int nmid 轉入儲存搜尋結果的引用

* @return bool

*/bool findmin(int* parray, int nlength, int& nmin)

int nleft = 0;

int nright = nlength - 1;

int nmid = -1;

//判斷是否為有序序列

if (parray[nleft] < parray[nright])

while (nleft < nright - 1)

nmid = (nleft + nright) / 2;

if (parray[nleft] > parray[nright])

else

}else

}nmin = parray[nleft] < parray[nright] ? parray[nleft] : parray[nright];

return true;

}int _tmain(int argc, _tchar* ar**)

; //int a = ;

int a = ;

//int a = ;

//int a = ;

int nlength = sizeof(a) / sizeof(a[0]);

int nmin = 0;

cout << "旋轉的陣列:" << endl;

for (int i = 0; i < nlength; i++)

bool bret = findmin(a, nlength, nmin);

if (bret)

else

system("pause");

return 0;

}

執行結果:

劍指offer 8 旋轉陣列的最小數字

把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個非遞減排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。首先需要找到旋轉陣列的開始位置。該陣列可以分為兩部分,兩部分都是已經排序的了。如果使用二分,那麼當arr start arr end 那麼就應該在這個缺件,因為,原始陣列是遞...

劍指offer 演算法題 09 旋轉陣列問題

題目描述 把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個遞增排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。例如陣列為的乙個旋轉,該陣列的最小值為1。輸入 輸入可能包含多個測試樣例,對於每個測試案例,輸入的第一行為乙個整數n 1 n 1000000 代表旋轉陣列的元素個數。...

劍指Offer 題11(旋轉陣列的最小數

1.題目 把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個非減排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。例如陣列為的乙個旋轉,該陣列的最小值為1。note 給出的所有元素都大於0,若陣列大小為0,請返回0。2.思路 可把旋轉後的陣列看做兩個有序陣列,以最小值為分界,前面...