Offer题8 旋转数组的最小值

来源:互联网 发布:淘宝头像店招在线制作 编辑:程序博客网 时间:2024/05/29 19:12
旋转数组的最小数字(P66)(面试题8)
题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1.

分析思路:
  1. 猜测用二分查找,则重点是定出移动左右两个边界的条件
  2. 当旋转至少一个元素时,data[left]≥data[right],在此基础上
    • 当data[mid]∈左半递增序列,data[mid]≥data[left]:left=mid;
    • 当data[mid]∈右半递增序列,data[mid]≤data[right]:right=mid;
    • 以上操作,保证了left∈左半递增序列,right∈右半递增序列,所以当left+1 == right时,data[right]==min

  3. 考虑不完善
    • 当旋转0个元素时,data[left]≤data[right],此时data[0]==min
    • 特例遇到这种data[left]==data[mid]==data[right]的情况,只能顺序搜索【易忽略】
#include<iostream>#include<vector>using namespace std;int FindMinInOrder(vector<int> &data,int left,int right){int Min = data[left];for(int i=left;i<=right;++i)if(data[i]<Min)Min = data[i];return Min;}int FindMinInRotateArray(vector<int> &data){if(data.empty())throw exception("array is empty");if(data[0] < data[data.size()-1]) //旋转0个元素return data[0];else  //旋转至少一个元素{int left=0,right=data.size()-1;int mid;while(left+1 != right){mid=(left+right)/2;if(data[left]==data[mid] && data[mid]==data[right])return FindMinInOrder(data,left,right);if(data[mid] >= data[left])left=mid;else if(data[mid] <= data[right])right=mid;}return data[right];}}int main(){   //Test1int array[]={3,3,3,3,4,5,1,2,3};int len = sizeof(array)/sizeof(int);vector<int> data(array,array+len);cout<<"最小元素为:"<<FindMinInRotateArray(data)<<endl;//Test2int array1[]={1,1,1,1,1,1,0,1,1};len = sizeof(array1)/sizeof(int);vector<int> data1(array1,array1+len);cout<<"最小元素为:"<<FindMinInRotateArray(data1)<<endl;//Test3int array2[]={2};len = sizeof(array2)/sizeof(int);vector<int> data2(array2,array2+len);cout<<"最小元素为:"<<FindMinInRotateArray(data2)<<endl;//Test4vector<int> data3;try{cout<<"最小元素为:"<<FindMinInRotateArray(data3)<<endl;}catch(exception& a){cout<<a.what()<<endl;}}
测试用例:
  • 功能测试(输入一个升序数组的旋转,数组中有重复数字或者没有重复数字)
  • 边界值测试(输入一个不旋转的升序数组、只包含一个数字的数组)
  • 特殊输入测试(输入NULL指针)






0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 宝宝拉肚子快一个月了怎么办 满月宝宝发烧38度怎么办 大人腹泻10天了怎么办 十个月宝贝拉水怎么办 十个月宝宝脱水哭闹怎么办 宝宝肠胃不好老是拉肚子怎么办 七个月的宝宝老是拉肚子怎么办 6个月宝宝拉肚子怎么办 没满月宝宝吐奶怎么办 八个月宝宝有点拉肚子怎么办 4个月宝宝拉水怎么办 2岁宝宝消化不好拉肚子怎么办 两岁宝宝老拉肚子怎么办 2岁宝宝拉肚子老不好怎么办 2岁宝宝一直拉肚子不好怎么办 5天新生儿拉稀水怎么办 4天新生儿拉稀水怎么办 新生儿40天拉稀水怎么办 一周多的宝宝拉肚子怎么办 出生半个月的宝宝拉肚子怎么办 刚出生几天的宝宝拉肚子怎么办 刚出生的宝宝拉肚子怎么办 出生八天的宝宝拉肚子怎么办 刚出生婴儿拉水怎么办 三岁宝宝一直吐怎么办 3岁宝宝一直吐怎么办 5个月宝宝一直吐怎么办 新生儿睡反了觉怎么办 吃母乳奶流量大怎么办 两个月宝宝有痰怎么办 婴儿瞌睡睡倒了怎么办 侧切伤口崩开了怎么办 脐带30天未脱落怎么办 洗眉结痂不掉怎么办 新生宝宝生殖器下面破皮怎么办 脐带未脱落渗血怎么办 车停店门口贴发单怎么办 有人要打我我该怎么办 很笨怎么办工作做不好 脸被电焊烤了疼怎么办 脸过敏痒的不行怎么办