NO6、旋转数组中的最小数字
题目描述:
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。
输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。
NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。
本题就是求数组中的最小值(个人理解)
输入
[3,4,5,1,2]
输出
1
解法一:
暴力遍历
class Solution {
public:
int minNumberInRotateArray(vector<int> rotateArray) {
if(rotateArray.size()==0) return 0;
int minNum=rotateArray[0],len=rotateArray.size();
for(int i=1;i<len;i++){
if(rotateArray[i]<minNum)//假设第一个数据就是最小值,然后通过暴力遍历,不断向后搜素,找到最小值
return rotateArray[i];//return不可以返回变量,需要返回一个常量
}
return minNum;
}
};
解法二:二分法
//二分法
class Solution {
public:
int minNumberInRotateArray(vector<int> rotateArray) {
if(rotateArray.size()==0)return 0;
int low=0,high=rotateArray.size()-1;
while(low+1<high){
int mid=low+(high-low)/2;
//右边的值大于中间的值,那么把high右移
if(rotateArray[mid]<rotateArray[high])high=mid;
//如果相等,那就比右边数值的下一个
else if(rotateArray[mid]==rotateArray[high])high=high-1;
else{
//如果相反就移动左边的值
low=mid;
}
}
return min(rotateArray[low],rotateArray[high]);
}
};
class Solution {
public:
int minNumberInRotateArray(vector<int> rotateArray) {
//不用在乎在这个数组是否是旋转的,只需要考虑这个数组的特性是单调有序,并且有最小值即可
if(rotateArray.size()==0)return 0;
//二分法
int low=0,high=rotateArray.size()-1;
while(low+1<high){
//先确定中间指针的值
int mid=low+(high-low)/2;
//数组单调有序 我们只在找最小,如果右边的数值较大,那么直接把high移动到mid的位置
if(rotateArray[mid]<rotateArray[high])high=mid;
//如果相等,那么high位就移动一位
else if(rotateArray[mid]==rotateArray[high])high=high-1;
//如果mid的值大于high,那么说的娇小的数字在右半部分
else if(rotateArray[mid]>rotateArray[high]){
low=mid;
}
}
return min(rotateArray[low],rotateArray[high]);
}
};