题目描述
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个非递减序列的一个旋转,输出旋转数组的最小元素。例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1
程序分析:
数据(1) 数据(2) 数据(3) 数据(4) 数据(5) 1 2 3 4 5 == == == == ==> 5 6 7 3 4 == == ==> == ==> 8 4 5 6 7 ==> == == == ==> 我们通过观察可以得到如果 数据(1)(开始的数据)和 数据(5)(末尾的数据)的大小可以得到,如果1<5,那么整个数组有序。第一个数就是我们要寻找的数。如果1>5,那么最小的数指可定在中间.程序的中间的顺序是一句如第二列的数据4->5增大,第三列7->8增大,那么直到我们遇到顺序相反时,那么就可以获取到我们的数值。
#include <iostream>
#include <vector>
using namespace std;
class Solution {
public:
int minNumberInRotateArray(vector<int> rotateArray) {
bool flag = true;
int min = 0;
int size = rotateArray.size();
if (rotateArray[0]<rotateArray[size - 1]){
flag = true;
}
else {
flag = false;
}
for (unsigned int i = 0; i< rotateArray.size() - 1; i++){
if (rotateArray[i]<rotateArray[i + 1]){
if (flag == true){
return rotateArray[i];
}
}
else if (rotateArray[i]>rotateArray[i + 1]){
if (flag == false){
return rotateArray[i + 1];
}
}
}
return 0;
}
};
void main()
{
getchar();
vector<int> v;
Solution *so = new Solution();
for (int i = 1; i < 6; i++)
{
printf("%3d", i);
v.push_back(i);
}
int num = so->minNumberInRotateArray(v);
printf("最小值 %d\n",num);
vector<int> v1;
for (int i = 0; i < 5; i++)
{
printf("%3d", (7+i)%5+3);
v1.push_back((7 + i) % 5+3);
}
num = so->minNumberInRotateArray(v1);
printf("最小值 %d\n", num);
vector<int> v3;
for (int i = 0; i < 5; i++)
{
printf("%3d", (9+ i) % 5 + 4);
v3.push_back((9+ i) % 5 + 4);
}
num = so->minNumberInRotateArray(v3);
printf("最小值 %d\n", num);
getchar();
}
- 结果
这个解决方案在牛客网上运转程序失败,程序段溢出
我们换个方法,我们找到前面的数比后面的数大
class Solution {
public:
int minNumberInRotateArray(vector<int> rotateArray) {
if(rotateArray.size()==0){
//printf("no elem in vector");
return 0;
}
for(int i = 0;i< rotateArray.size()-1;i++){
if(rotateArray[i]>rotateArray[i+1]){
return rotateArray[i+1];
}
}
return rotateArray[0];
}
};