剑指offer:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。
思路:本题有歧义,只能遍历。
class Solution {
public:
int minNumberInRotateArray(vector<int> rotateArray) {
int arry_size = rotateArray.size();
if(arry_size == 0)
return 0;
int min = 0xefff;
for(int i = 0; i < arry_size; i++){
if(min > rotateArray[i])
min = rotateArray[i];
}
return min;
}
};
本题的意思应该是,数列a[i+1] > = a[i];
使用二分查找,代码如下
#include <iostream>
#include <stdlib.h>
#include <vector>
#include "targetver.h"
#include <stdio.h>
#include <tchar.h>
#include <stdio.h>
#include <stdlib.h>
#include<conio.h>
using namespace std;
class Solution {
public:
int minNumberInRotateArray(vector<int> rotateArray) {
if (rotateArray.empty()) {
return 0;
}
int low = 0;
int high = rotateArray.size() - 1;
int middle = 0;
if (rotateArray.at(low) < rotateArray.at(high)) { //说明已经是非递减排序,直接返回第一个最小元素
return rotateArray.at(low);
}
//二分查找
while (low < high) {
if (high - low == 1) {
middle = high;
break;
}
int middle = (low + high) / 2;
if (rotateArray.at(middle) >= rotateArray.at(low)) {
low = middle;
}
else if (rotateArray.at(middle) <= rotateArray.at(low)) {
high = middle;
}
}
return rotateArray.at(middle);
}
};
int main()
{
Solution s;
int arry[5] = {4,5,1,2,3};
vector<int> text(&arry[0],&arry[4]);
int min = s.minNumberInRotateArray(text);
system("pause");
return 0;
}