题意:有一个长度为 n 的非降序数组,将它进行旋转,即把一个数组最开始的若干个元素搬到数组的末尾,变成一个旋转数组。问,给定这样一个旋转数组,求数组中的最小值。
方法一:
直接遍历
思路:因为原数组是非降序数组,又把一个数组最开始的若干个元素搬到数组的末尾,那么数组的最大值一定与最小值相邻。
for一遍,查找如果前面的值大于后面的值,则说明后面的这个值是最小值。
class Solution {
public:
int minNumberInRotateArray(vector<int> rotateArray) {
int n=rotateArray.size();
for(int i=1;i<n;i++){//for循环
if(rotateArray[i-1]>rotateArray[i])//如果前面的值大于后面的值,则说明后面的这个值是最小值
return rotateArray[i];
}
return rotateArray[0];
}
};
时间复杂度:
空间复杂度:
方法二:
二分
思路:利用二分算法 维持一段递增的区间(即比较中间值和左右边界值)。
如果中间值大于左边界值,则通过来缩小范围;
如果中间值小于等于左边界并且小于右边界,则来缩小范围;
如果都不满足,则通过来缩小范围。
特殊情况:
如果左边界值小于右边界值,说明已成功。
class Solution {
public:
int minNumberInRotateArray(vector<int> rotateArray) {
int n=rotateArray.size();
int l=0,r=n-1,mid;//初始化左右边界
while(l<r){
if(rotateArray[l]<rotateArray[r])//特殊情况:如果左边界小于右边界,返回左边界的值
return rotateArray[l];
mid=(l+r)/2;//二分
if(rotateArray[mid]>rotateArray[l]){//如果大于左边界,则l=mid+1
l=mid+1;
}else if(rotateArray[mid]<rotateArray[r]){//如果小于等于左边界并且小于右边界,则r=mid
r=mid;
}else{//如果都不是,则缩小范围,l++
l++;
}
}
return rotateArray[l];
}
}; 时间复杂度:
空间复杂度:![]()



京公网安备 11010502036488号