(本部落格旨在個人總結回顧)
題目描述:
把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個遞增排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。例如陣列為的乙個旋轉,該陣列的最小值為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.思路 可把旋轉後的陣列看做兩個有序陣列,以最小值為分界,前面...