题目来源:牛客网——旋转数组的最小数字
题目描述
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。
输入一个 非递减排序 的数组的一个旋转,输出旋转数组的最小元素。
例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。
NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。
解题思路:
非递减排序
: 就是递增排序但可能会有连续的相同数字。ex: 123333456
代码:
1. C++
class Solution {
public:
int minNumberInRotateArray(vector<int> rotateArray) {
if(rotateArray.size() <= 0)
return NULL;
int low = 0, high = rotateArray.size() - 1, mid = 0;
while(low < high){
// 第一个非递减排序子数组小于第二个非递减排序子数组 ex: 128 3456
if(rotateArray[low] < rotateArray[high]){
return rotateArray[low];
}
mid = (low + (high-low)) / 2;
// A[mid]>A[low] 说明mid处于第一个非递减排序子数组
if(rotateArray[mid] > rotateArray[low]){
low = mid + 1;
}
// A[mid]<A[high] 说明mid处于第二个非递减排序子数组
else if(rotateArray[mid] < rotateArray[high]){
high = mid;
}
// 如果相等,则low++ 缩小比较范围
else{
low ++;
}
}
return rotateArray[low];
}
};
2. Java
import java.util.ArrayList;
public class Solution {
public int minNumberInRotateArray(int [] rotateArray) {
if(rotateArray.length <= 0)
return -1;
int low = 0, high = rotateArray.length - 1, mid = 0;
while(low < high){
// 第一个非递减排序子数组小于第二个非递减排序子数组 ex: 128 3456
if(rotateArray[low] < rotateArray[high]){
return rotateArray[low];
}
mid = (low + (high-low)) / 2;
// A[mid]>A[low] 说明mid处于第一个非递减排序子数组
if(rotateArray[mid] > rotateArray[low]){
low = mid + 1;
}
// A[mid]<A[high] 说明mid处于第二个非递减排序子数组
else if(rotateArray[mid] < rotateArray[high]){
high = mid;
}
// 如果相等,则low++ 缩小比较范围
else{
low ++;
}
}
return rotateArray[low];
}
}