算法复杂度略高
class Solution {
int minNumberInRotateArray(vector<int> rotateArray) {
if (rotateArray.size() == 0)
return 0;
auto it1 = rotateArray.end()-1;
auto it2 = rotateArray.end() - 2;
while (*it2 <= *it1)
{
it1--;
it2--;
}
return *it1;
}
};
这是一道变形的二分查找题
class Solution {
public:
int minNumberInRotateArray(vector<int> rotateArray) {
int size = rotateArray.size();
if (size == 0)
return 0;
int left = 0, right = size - 1;
int mid = 0;
// rotateArray[left] >= rotateArray[right] 确保旋转
while (rotateArray[left] >= rotateArray[right]) {
// 分界点
if (right - left == 1) {
mid = right;
break;
}//if
mid = left + (right - left) / 2;
// rotateArray[left] rotateArray[right] rotateArray[mid]三者相等
// 无法确定中间元素是属于前面还是后面的递增子数组
// 只能顺序查找
if (rotateArray[left] == rotateArray[right] && rotateArray[left] == rotateArray[mid]) {
return MinOrder(rotateArray, left, right);
}//if
// 中间元素位于前面的递增子数组
// 此时最小元素位于中间元素的后面
if (rotateArray[mid] >= rotateArray[left]) {
left = mid;
}//if
// 中间元素位于后面的递增子数组
// 此时最小元素位于中间元素的前面
else {
right = mid;
}//else
}//while
return rotateArray[mid];
}
private:
int MinOrder(vector<int> rotateArray, int left, int right)
{
int tempMin = rotateArray[left];
for (int index = left+1 ; index < right; ++index)
{
if (rotateArray[index] <= tempMin)
tempMin = rotateArray[index];
}
return tempMin;
}
};