日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

《剑指offer》c++版本 11. 旋转数组的最小数字

發布時間:2025/4/5 c/c++ 16 豆豆
生活随笔 收集整理的這篇文章主要介紹了 《剑指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. 旋转数组的最小数字的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。