《剑指offer》c++版本 11. 旋转数组的最小数字
生活随笔
收集整理的這篇文章主要介紹了
《剑指offer》c++版本 11. 旋转数组的最小数字
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
如題:
把一個數組最開始的若干個元素搬到數組的末尾,我們稱之為數組的旋轉。 輸入一個非遞減排序的數組的一個旋轉,輸出旋轉數組的最小元素。 例如數組{3,4,5,1,2}為{1,2,3,4,5}的一個旋轉,該數組的最小值為1。 NOTE:給出的所有元素都大于0,若數組大小為0,請返回0。題意就是數組中查找最小值,最直接的方法就是排序后得到最小值,但是題目已經指明,數組為非遞減數組。有序數組查找一個數,顯然用二分法。這題最好的方法就是二分法,雖然暴力遍歷找最小值也可以,但是既然有序了,何必畫蛇添足。
仔細觀察旋轉有序數組,二分之后,必有一半是有序的,另一半可能是無序,也可能是有序(沒有旋轉)。比較方法就是取中值,和首尾比較即可。對于有序數組,左邊界即為最小值,對于無序數組,繼續遞歸二分,返回最小值。
此外,編碼的時候,注意邊界,比如數組為空,取中值不要用 mid = (start+end)/2 的方式,極端情況下整型溢出,最好用
mid = start+(end-start)/2;
下面是本題的c++編碼:
//普通解法就是遍歷數組查找最小值。 //此題的一個條件是遞增數組,有序數組中查找一個數最好的方法是二分法 //二分查找,如果數組有序,返回最小值,如果無序則繼續二分。 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;//有序數組if (Array[start] <= Array[mid]){min1 = Array[start];if (Array[mid+1] <= Array[end])min2 = Array[mid+1];else{//無序數組繼續二分min2 = getMinInArray(Array, mid+1, end); }}else{//無序數組繼續二分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應用程序、內核、驅動、后臺開發交流討論群(745510310),感興趣的同學可以加群討論、交流、資料查找等,前進的道路上,你不是一個人奧^_^。
總結
以上是生活随笔為你收集整理的《剑指offer》c++版本 11. 旋转数组的最小数字的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 聊城市退役军人事务局供应站是干什么的
- 下一篇: 《剑指offer》c++版本 12. 矩