题目描述:
示例:
方法一:
遍历数组,当数组的后一个值比前一个值小的时候,那么后一个值就是所求
遍历完数组如果没有找到,那么这个数组就是单调递增的数组,没有进行转换,直接返回第一个值就可以
C++
class Solution {
public:
int minNumberInRotateArray(vector<int> rotateArray) {
if(rotateArray.empty()) return 0;
for(int i = 1;i<rotateArray.size();i++)
{
if(rotateArray[i] < rotateArray[i-1]) return rotateArray[i];
}
return rotateArray[0];
}
};
C
int minNumberInRotateArray(int* rotateArray, int rotateArrayLen ) {
if(rotateArrayLen == 0) return 0;
for(int i = 1;i<rotateArrayLen;i++)
if(rotateArray[i] < rotateArray[i-1]) return rotateArray[i];
return rotateArray[0];
}
方法二:
即使这个数组进行旋转,但这个数组还是有序的
可以使用二分法查找
定义第一个left和最后一个right 和中间mid
当left和right相邻时 ,mid = right
mid 取left和right中间的值
当mid = right 或者mid = left时按照方法一进行
否则就变换mid值
当一遍是顺序的,那么就排除这一边,
class Solution {
public:
int minNumberInRotateArray(vector<int> rotateArray) {
if (rotateArray.empty()) return 0;
int left = 0;
int right = rotateArray.size() - 1;
int mid = 0;
while (rotateArray[left] >= rotateArray[right]) {
if (right - left == 1)
{
mid = right;
break;
}
mid = left + ((right - left) >> 1);
if (rotateArray[mid] == rotateArray[left] && rotateArray[left] ==
rotateArray[right]) {
int result = rotateArray[left];
for (int i = left + 1; i < right; i++) {
if (result > rotateArray[i]) {
result = rotateArray[i];
}
}
return result;
}
if((rotateArray[mid] >= rotateArray[left])
&& (rotateArray[left] >= rotateArray[right]))
left = mid;
else right = mid;
}
return rotateArray[mid];
}
};
相比较于C++代码,我对C的代码进行了一点优化,本质丝毫没有变,
其主体和思路都是一样的,
C
int minNumberInRotateArray(int* rotateArray, int rotateArrayLen)
{
if (rotateArrayLen == 0) return 0;
int left = 0;
int right = rotateArrayLen - 1;
int mid = 0;
while (rotateArray[left] >= rotateArray[right]) {
if (right - left == 1) return rotateArray[right];
mid = left + ((right - left) >> 1);
if (rotateArray[mid] == rotateArray[left] && rotateArray[left] ==
rotateArray[right]) {
int result = rotateArray[left];
for (int i = left + 1; i < right; i++)
if (result > rotateArray[i]) return rotateArray[i];
}
if ((rotateArray[mid] >= rotateArray[left])
&& (rotateArray[left] >= rotateArray[right]))
left = mid;
else right = mid;
}
return rotateArray[mid];
}