/*!
* @file 旋转数组中的最小数字.cpp
* @Date: 2018/01/30 15:21
* @author: sicaolong
* @Contact: sicaolong@163.com
* @brief:
* @TODO:
*/
// 面试题11:旋转数组的最小数字
// 题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。
// 输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如数组
// {3, 4, 5, 1, 2}为{1, 2, 3, 4, 5}的一个旋转,该数组的最小值为1。
#include<iostream>
using namespace std;
int Min(int *a, int length);
int Min_In_Order(int *a, int index1, int index2);
int main()
{
int n;
cout << "请您输入数组的个数n:" << endl;
cin >> n;
int *a = new int[n];
cout << "请您输入您要输入的数据:" << endl;
for (int i = 0; i < n; ++i)
{
cout << "请您输入第" << i + 1 << "个数据:";
cin >> a[i];
}
cout << "您输入的数组的数据为:" << endl;
for(int i=0;i<n;i++)
cout<<a[i]<<" ";
cout<<endl;
//最小数据small
int small=Min(a, n);
cout <<"最小的数据为:"<<small << endl;
cout << "此时的数组输出为:" << endl;
for(int i=0;i<n;i++)
cout<<a[i]<<" ";
cout<<endl;
}
int Min(int *a, int length)
{
//判断是否有意义;
if (!a || length < 0)
throw new exception("错误!");
int index1 = 0;
int index2 = length - 1;
int index_mid = index1;//定义中间位置;
while (a[index1]>=a[index2])//只有前侧值大于后侧值才有意义进行下面;
{
if (1 == index2 - index1)
{
index_mid = index2;
break;
}
else
index_mid = (index1 + index2) / 2;
//如果三个数字相等,则只能顺序查找;
if (a[index1] == a[index2] && a[index_mid] == a[index1])
return Min_In_Order(a, index1, index2);
if (a[index_mid]>a[index1])//如果中间值大于a[index1],则index1指向中间位置;确保index1指向最大的位置
{
index1 = index_mid;
}
else if (a[index_mid]<a[index2])//如果中间值小于a[index2],则index2指向中间位置;确保index2指向最小的位置;
{
index2 = index_mid;
}
}
return a[index_mid];
}
//============当 三个值相等的时候,找出最小值;
int Min_In_Order(int *a, int index1, int index2)
{
int result = a[index1];
for (int i = index1 + 1; i <= index2;++i)//index1到index2中找出最小值;
{
if (result>a[i])
{
result = a[i];//result始终保持最小;
}
}
return result;//返回最小值;
}
(3)剑指offer 14求旋转数组中的最小数字
最新推荐文章于 2022-03-19 13:48:27 发布