题目描述
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。
例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。
NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。
题目地址
思路
- 二分查找
- 二分查找需要有一个目标值 target,这里的 target 可以选
nums[hi]
或nums[lo]
,这里使用过的是nums[hi]
- 注意有重复的情况,特别是
{3, 4, 5, 1, 2, 3}
,这里有一个简单的处理方法
Code
class Solution {
public:
int minNumberInRotateArray(vector<int> rotateArray) {
if (rotateArray.empty())
return 0;
int lo = 0;
int hi = rotateArray.size() - 1;
// 完全旋转,或者说没有旋转(需要, e.g {1, 2})
if (rotateArray[lo] < rotateArray[hi])
return rotateArray[lo];
while (lo + 1 < hi) {
int mid = lo + (hi - lo) / 2;
if (rotateArray[mid] > rotateArray[hi])
lo = mid;
else if (rotateArray[mid] < rotateArray[hi])
hi = mid;
else
hi--; // 防止这种情况 {3,4,5,1,2,3}
}
return rotateArray[hi];
}
};
Code(改进)
class Solution {
public:
int minNumberInRotateArray(vector<int> rotateArray) {
if (rotateArray.empty())
return 0;
int n = rotateArray.size();
// 没有旋转的情况
//if (rotateArray[0] < rotateArray[n-1])
// return rotateArray[lo];
int lo = -1; // 如果初始化为 0 将无法处理 n == 2 的情况,初始化为 -1 就可以了
int hi = n - 1;
while (lo + 1 < hi) {
int mid = lo + (hi - lo) / 2;
if (rotateArray[mid] > rotateArray[hi])
lo = mid;
else if (rotateArray[mid] < rotateArray[hi])
hi = mid;
else
hi--; // 防止这种情况 {3,4,5,1,2,3}
}
return rotateArray[hi];
}
};