《剑指offer》c++版本 11. 旋转数组的最小数字
如題:
把一個(gè)數(shù)組最開始的若干個(gè)元素搬到數(shù)組的末尾,我們稱之為數(shù)組的旋轉(zhuǎn)。 輸入一個(gè)非遞減排序的數(shù)組的一個(gè)旋轉(zhuǎn),輸出旋轉(zhuǎn)數(shù)組的最小元素。 例如數(shù)組{3,4,5,1,2}為{1,2,3,4,5}的一個(gè)旋轉(zhuǎn),該數(shù)組的最小值為1。 NOTE:給出的所有元素都大于0,若數(shù)組大小為0,請(qǐng)返回0。題意就是數(shù)組中查找最小值,最直接的方法就是排序后得到最小值,但是題目已經(jīng)指明,數(shù)組為非遞減數(shù)組。有序數(shù)組查找一個(gè)數(shù),顯然用二分法。這題最好的方法就是二分法,雖然暴力遍歷找最小值也可以,但是既然有序了,何必畫蛇添足。
仔細(xì)觀察旋轉(zhuǎn)有序數(shù)組,二分之后,必有一半是有序的,另一半可能是無序,也可能是有序(沒有旋轉(zhuǎn))。比較方法就是取中值,和首尾比較即可。對(duì)于有序數(shù)組,左邊界即為最小值,對(duì)于無序數(shù)組,繼續(xù)遞歸二分,返回最小值。
此外,編碼的時(shí)候,注意邊界,比如數(shù)組為空,取中值不要用 mid = (start+end)/2 的方式,極端情況下整型溢出,最好用
mid = start+(end-start)/2;
下面是本題的c++編碼:
//普通解法就是遍歷數(shù)組查找最小值。 //此題的一個(gè)條件是遞增數(shù)組,有序數(shù)組中查找一個(gè)數(shù)最好的方法是二分法 //二分查找,如果數(shù)組有序,返回最小值,如果無序則繼續(xù)二分。 class Solution { public:int getMinInArray(vector<int> &Array,int start, int end){int min1, min2;//邊界判斷if (start > end)return INT_MAX;if (start == end)return Array[start];//取中值int mid = (end-start)/2 + start;//有序數(shù)組if (Array[start] <= Array[mid]){min1 = Array[start];if (Array[mid+1] <= Array[end])min2 = Array[mid+1];else{//無序數(shù)組繼續(xù)二分min2 = getMinInArray(Array, mid+1, end); }}else{//無序數(shù)組繼續(xù)二分min1 = getMinInArray(Array, start, mid);min2 = Array[mid+1];}return min1 > min2 ? min2 : min1;}int minNumberInRotateArray(vector<int> rotateArray) {int min, len = rotateArray.size();vector<int> &rVec = rotateArray;//特殊情況處理if (rotateArray.size() < 1)return 0;return getMinInArray(rVec,0, len-1);} };=============================================================================================
Linux應(yīng)用程序、內(nèi)核、驅(qū)動(dòng)、后臺(tái)開發(fā)交流討論群(745510310),感興趣的同學(xué)可以加群討論、交流、資料查找等,前進(jìn)的道路上,你不是一個(gè)人奧^_^。
總結(jié)
以上是生活随笔為你收集整理的《剑指offer》c++版本 11. 旋转数组的最小数字的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 聊城市退役军人事务局供应站是干什么的
- 下一篇: 《剑指offer》c++版本 12. 矩