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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

剑指offer-旋转数组的最小数字

發布時間:2025/5/22 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 剑指offer-旋转数组的最小数字 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

旋轉數組的最小數字

一、題目描述

把一個數組最開始的若干個元素搬到數組的末尾,我們稱之為數組的旋轉。 輸入一個非減排序的數組的一個旋轉,輸出旋轉數組的最小元素。 例如數組{3,4,5,1,2}為{1,2,3,4,5}的一個旋轉,該數組的最小值為1。 NOTE:給出的所有元素都大于0,若數組大小為0,請返回0。

二、解決方案

2.1、解決方案1

最簡單的就是使用C++現成的函數min_element()方法即可。
代碼簡潔,如下所示:

class Solution { public:int minNumberInRotateArray(vector<int> rotateArray) {if(rotateArray.size()==0){return 0;}else{vector<int>::iterator smallest=min_element(rotateArray.begin(),rotateArray.end());return *smallest;}} };

2.1、解決方案2

旋轉數組有一個特點,它實際上由兩組非遞減序列構成,左側的序列均大于右側的序列,而最小值恰恰在分界點的右側。我們只需要找到這個分界點。按照這個思想,我們便設計出時間復雜度為O(n)的算法如下。

public int minNumberInRotateArray(int[] array) {if (array.length == 0)return 0;for (int i = 0; i < array.length - 1; i++) {if (array[i] > array[i + 1])return array[i + 1];}return array[0];}

當然,還有更快的方法,使用二分查找的思想,可以定位最小值所在的位置,因為這是接近有序的數組。

鏈接:https://www.nowcoder.com/questionTerminal/9f3231a991af4f55b95579b44b7a01ba 來源:牛客網class Solution { public:int minNumberInRotateArray(vector<int> rotateArray) {int size = rotateArray.size();if(size == 0){return 0;}//ifint left = 0,right = size - 1;int mid = 0;// rotateArray[left] >= rotateArray[right] 確保旋轉while(rotateArray[left] >= rotateArray[right]){// 分界點if(right - left == 1){mid = right;break;}//ifmid = left + (right - left) / 2;// rotateArray[left] rotateArray[right] rotateArray[mid]三者相等// 無法確定中間元素是屬于前面還是后面的遞增子數組// 只能順序查找if(rotateArray[left] == rotateArray[right] && rotateArray[left] == rotateArray[mid]){return MinOrder(rotateArray,left,right);}//if// 中間元素位于前面的遞增子數組// 此時最小元素位于中間元素的后面if(rotateArray[mid] >= rotateArray[left]){left = mid;}//if// 中間元素位于后面的遞增子數組// 此時最小元素位于中間元素的前面else{right = mid;}//else}//whilereturn rotateArray[mid];} private:// 順序尋找最小值int MinOrder(vector<int> &num,int left,int right){int result = num[left];for(int i = left + 1;i < right;++i){if(num[i] < result){result = num[i];}//if}//forreturn result;} };

轉載于:https://www.cnblogs.com/MarkKobs-blog/p/10351457.html

總結

以上是生活随笔為你收集整理的剑指offer-旋转数组的最小数字的全部內容,希望文章能夠幫你解決所遇到的問題。

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