问题:
旋转数组即将一递增数组的前若干个数字移动到数组的最后面。现输入一旋转数组,查找数组中的最小值。
分析:
我们可以二维立体直观化:
高度表示值大小,长度表示数组的序号数,理想化为线性增长。
mid可分为两种种情况:
1.mid值在大块中时,数组[mid]>=数组[end],令start=mid;
2.mid值在小块中时,数组[mid]<数组[end],令end=mid;
#include<iostream>
using namespace std;
int main()
{
int m;
cout<<"请输入一维数组的大小:";
cin>>m;
int a[m];
cout<<"请输入数组值:(旋转数组)";
for(int i=0;i<m;i++)
{
cin>>a[i];
}
int start,mid,end;
start = 0;
end=sizeof(a)/sizeof(a[0])-1;
mid=(start+end)/2;
while(start<end)
{
if(end-start==1)
{
mid=end;
break;
}
mid=(start+end)/2;
if(a[mid]>=a[end])//满足条件,说明最小值在右边,反之左边
{
start=mid;
}
else
{
end=mid;
}
}
//cout<<start<<end<<mid<<endl//辅助查看start mid end 的指向
cout<<a[start+1];//加1是因为start+1=end,上面循环跳出条件也是如此
return 0;
}