旋转数组的最小数字

来源:互联网 发布:动漫网站源码整套 编辑:程序博客网 时间:2024/05/21 09:07
题目描述

把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个非递减序列的一个旋转,输出旋转数组的最小元素。例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。

递归方法:

class Solution {public:    bool validInput=true;    int getNum(vector<int> arr,int i, int j)    {        if(i==j || i+1==j)            return arr[i]>arr[j]?arr[j]:arr[i];        int mid=(i+j)/2;        if(arr[i]==arr[mid] && arr[mid]==arr[j])        {            int find1=getNum(arr,i,mid);            int find2=getNum(arr,mid+1,j);            return find1>find2?find2:find1;                    }        else if(arr[mid]>=arr[i] && arr[mid]>arr[j])            i=mid;        else            j=mid;                return getNum(arr,i,j);        }    int minNumberInRotateArray(vector<int> rotateArray) {        int len=rotateArray.size();        if(len<=0)         {                validInput=false;            return 0;        }        int i=0,j=len-1;        return getNum(rotateArray,0,len-1);    }};
非递归方法:

 int getMin(vector<int> arr,int i,int j)     {         int min=arr[i];         for(int k=i+1;k<=j;k++)         {             if(arr[k]<min)                 min=arr[k];            }         return min;     }     int getNum(vector<int> arr, int i,int j)     {         int mid = 0;         while(arr[i]>=arr[j])         {             if(j-i==1) //若不加上这个条件,会出现死循环的哦!!!!!注意!!!!                 return arr[i]>arr[j]?arr[j]:arr[i];             mid=(i+j)/2;             if(arr[i]==arr[mid] && arr[mid]==arr[j])             {                 return getMin(arr,i,j);             }             else if(arr[i]<=arr[mid] && arr[mid]>arr[j]) //注意这个条件啊,很容易弄错的                 i=mid;             else                 j=mid;         }         return arr[mid];            }     int minNumberInRotateArray(vector<int> rotateArray) {          int len=rotateArray.size();        if(len<=0)         {                validInput=false;            return 0;        }        int i=0,j=len-1;        return getNum(rotateArray,0,len-1);     }


0 0