来源:
题目描述:
普通做法思路:
非降序数组,也就是说前面都是小的数字,但是有一部分被拿到后面去了,我们依次遍历,前方未修改的地方肯定是 rotateArray[i]< rotateArray[i+1]的,向后遍历时第一个出现rotateArray[i]> rotateArray[i+1]的,此时rotateArray[i+1]就是最小值。
class Solution {
public:
int minNumberInRotateArray(vector<int> rotateArray) {
if(rotateArray.size() == 0) return 0;
int len = rotateArray.size();
//依次遍历比较 把
for(int i = 0; i < len-1; i++){
if(rotateArray[i] > rotateArray[i+1]) return rotateArray[i+1];
}
return rotateArray[0];
}
};
二分法思路
- 如果该数组有一部分被旋转了,那么就不可能会有rotateArray[mid] < rotateArray[high],出现此情况只可能是该数组未被旋转,此时通过二分法继续遍历;
- rotateArray[mid] == rotateArray[high],例如12222, 12333这种情况一个一个的遍历
- rotateArray[mid] > rotateArray[high] 这里说明有旋转,最小值肯定被旋转到后面去了;
int minNumberInRotateArray(vector<int> rotateArray) {
if( rotateArray.size() == 0) return 0;
int low = 0, high = rotateArray.size()-1;
while(low + 1 < high){
int mid = low + (high - low)/2;
if(rotateArray[mid] < rotateArray[high]) high = mid;//说明右边有序,那就向左边走
else if(rotateArray[mid] == rotateArray[high]) high = high-1;// 这种情况跟是特例只能一个一个的判断
else
low = mid;
}
return min(rotateArray[low], rotateArray[high]);
}