LeetCode---Find Minimum in Rotated Sorted Array

来源:互联网 发布:淘宝助理有什么作用 编辑:程序博客网 时间:2024/06/05 06:46

题目大意:给出一个旋转的拍过序的数组,找出其中的最小元素。

算法思想:直接遍历数组,找出最小的元素即可。

代码如下:

class Solution {public:    int findMin(vector<int>& nums) {        if(nums.size()==0) return 0;        vector<int>::iterator pos;        int Min=nums[0];        for(pos=nums.begin();pos!=nums.end();++pos){            if(*pos<Min)                 Min=*pos;        }        return Min;            }};

上述算法效率不高,虽然能通过测试。下面给出优化算法:

1.当数组元素为0或者只有1个或者已经有序则可以直接返回。

2.旋转数组将之前有序的数组分为两部分,一部分元素都比另一部分元素大这里称为大端,则另一部分为小端。

3.采用折半查找的方法,将中间值与先与左端比较。会有3种情况。

1)a[mid]<a[left]时  说明a[mid]在小端,此时需判断若是小端第一个元素则找到,否则更新right.

2)              >    时。  a[mid]在大端,此时需判断若是大端最后一个元素则找到,否则更新left.

3)            =   时。  将a[mid]分别于右端值比较,过程同左端。(注意当a[mid]=a[left]=a[right]时,此时需打破平衡 是的right--;)

4.返回目标值。

代码如下:

class Solution {public:    int minNumberInRotateArray(vector<int> rotateArray) {    int n=rotateArray.size();        if(n==0) return 0;        if(n==1||rotateArray[0]<rotateArray[n-1]) return rotateArray[0];        int right=n-1,left=0,mid;        while(left<=right){            mid=(left+right)/2;            if(rotateArray[mid]>rotateArray[left])//在大端             {            if(rotateArray[mid+1]<rotateArray[mid])//大端最后一个                  {                   ++mid;      break; }                left=mid+1;            }            else if(rotateArray[mid]<rotateArray[left])//在小端                 {  if(rotateArray[mid-1]>rotateArray[mid])//小端第一个       break;    right=mid-1;    }            else //相等的时候比较右边                 {   if(rotateArray[mid]<rotateArray[right]){      if(rotateArray[mid-1]>rotateArray[mid])//小端第一个         break;        right=mid-1;   }   else if(rotateArray[mid]>rotateArray[right])//在大端   {      if(rotateArray[mid+1]<rotateArray[mid])//大端最后一个         {                   ++mid;      break;        }      left=mid+1;   }     else        {       --right;   }}        }        return rotateArray[mid];    }};


0 0
原创粉丝点击