旋转数组
Posted tianzeng
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了旋转数组相关的知识,希望对你有一定的参考价值。
题目
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。
#include <iostream> using namespace std; class Solution { public: int find_min_elem(int a[],int len); int min_order(int a[],int left,int right); }; int Solution::find_min_elem(int a[],int len) { if(a==nullptr||len<=0) return -1; int left=0; int right=len-1; int middle=left; while(a[left]>=a[right]) { if(right-left==1) { return a[right]; break; } int middle=(left+right)/2; //特殊测试。 a[left]==a[right]&&a[left]==a[middle]三值相等。只能顺序查找 if(a[left]==a[right]&&a[left]==a[middle]) return min_order(a,left,right); if(a[left]<a[middle]) left=middle; else right=middle; } return a[middle]; } int Solution::min_order(int a[],int left,int right) { int res=a[left]; for(int i=left+1;i<=right;++i) { if(res>a[i]) res=a[i]; } return res; } int main() { Solution s; int a[]={1,0,1,1,1}; int res=s.find_min_elem(a,sizeof(a)/sizeof(a[0])); if(res<0) cerr<<"error"<<endl; else cout<<res<<endl; return 0; }
以上是关于旋转数组的主要内容,如果未能解决你的问题,请参考以下文章