Offer题8 旋转数组的最小值
2016-03-27 21:17
519 查看
旋转数组的最小数字(P66)(面试题8)
题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1.
分析思路:
猜测用二分查找,则重点是定出移动左右两个边界的条件
当旋转至少一个元素时,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
考虑不完善
当旋转0个元素时,data[left]≤data[right],此时data[0]==min
特例
遇到这种data[left]==data[mid]==data[right]的情况,只能顺序搜索【易忽略】
测试用例:
功能测试(输入一个升序数组的旋转,数组中有重复数字或者没有重复数字)
边界值测试(输入一个不旋转的升序数组、只包含一个数字的数组)
特殊输入测试(输入NULL指针)
题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1.
分析思路:
猜测用二分查找,则重点是定出移动左右两个边界的条件
当旋转至少一个元素时,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
考虑不完善
当旋转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() { //Test1 int 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; //Test2 int 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; //Test3 int array2[]={2}; len = sizeof(array2)/sizeof(int); vector<int> data2(array2,array2+len); cout<<"最小元素为:"<<FindMinInRotateArray(data2)<<endl; //Test4 vector<int> data3; try{ cout<<"最小元素为:"<<FindMinInRotateArray(data3)<<endl; } catch(exception& a) { cout<<a.what()<<endl; } }
测试用例:
功能测试(输入一个升序数组的旋转,数组中有重复数字或者没有重复数字)
边界值测试(输入一个不旋转的升序数组、只包含一个数字的数组)
特殊输入测试(输入NULL指针)
相关文章推荐
- jqueryEasyUi 后台页面结构设计
- 如何在手机上访问电脑上写好的html页面——通过iis
- JS异步阻塞的迷思
- css 动画圆环
- jquery EasyUi 登录页设计
- servlet+jquery的简单实现
- jquery
- 网易2016实习生前端笔试题部分总结
- caffe源码分析:layer.hpp分析
- jquery 图片没有路径,不显示图片。
- 【ReactJS】一、手把手搭建ReactJS开发环境(Sublime)
- 【ReactJS】一、手把手搭建ReactJS开发环境(Sublime)
- 剑指offer 反向遍历链表
- [Offer收割] 编程练习赛3
- JS DOM编程艺术学习笔记(一)
- 学习jQuery的感受
- ReactiveCocoa使用记录
- hihocoder offer收割赛。。#1284
- HTML—Window.document对象
- caffe: test code Check failed: K_ == new_K (768 vs. 1024) Input size incompatible with inner product parameters.