题目描述
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。
例如数组{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];
}
};

本文介绍了一种在旋转数组中查找最小元素的高效算法。通过二分查找法,即使在存在重复元素的情况下,也能准确找到最小值。文章提供了详细的代码实现,并针对特殊情况进行了优化。
6万+

被折叠的 条评论
为什么被折叠?



