网址
描述
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。
输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。
NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。
1.遍历法---选出第一个小于下一个数的元素,复杂度O(n)。
class Solution {
public:
int minNumberInRotateArray(vector<int> r) {
for(int i=1;i<r.size();i++){
if(r[i-1]>r[i])
return r[i];
}
return r[0];
}
};
2.二分法---三种情况,复杂度O(log2n~n)
(1)mid>high,则翻转在后半段(不包括mid)-->下界直接提高到mid+1
(2)mid=high,则无法确定,挨个遍历-->high--
(3)mid<high,则后半段无翻转,选取前半段(包含mid)-->high=mid
class Solution {
public:
int minNumberInRotateArray(vector<int> r) {
int low=0,high=r.size()-1;
int mid;
while(low<high){
mid=low+(high-low)/2;
if(r[mid]>r[high])
low=mid+1;
else if(r[mid]==r[high])
high--;
else
high=mid;
}
return r[low];
}
};