剑指offer-旋转数组的最小数字
生活随笔
收集整理的這篇文章主要介紹了
剑指offer-旋转数组的最小数字
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
旋轉數組的最小數字
一、題目描述
把一個數組最開始的若干個元素搬到數組的末尾,我們稱之為數組的旋轉。 輸入一個非減排序的數組的一個旋轉,輸出旋轉數組的最小元素。 例如數組{3,4,5,1,2}為{1,2,3,4,5}的一個旋轉,該數組的最小值為1。 NOTE:給出的所有元素都大于0,若數組大小為0,請返回0。
二、解決方案
2.1、解決方案1
最簡單的就是使用C++現成的函數min_element()方法即可。
代碼簡潔,如下所示:
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-旋转数组的最小数字的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2019年1月29日
- 下一篇: 验证码画布生成以及点击图片切换验证码