题解 | #旋转数组的最小数字#
旋转数组的最小数字
http://www.nowcoder.com/practice/9f3231a991af4f55b95579b44b7a01ba
思路:数组是非降序数组,此题 比较右端点,如果旋转则旋转后 [l,k] 非降序 ,[k,r] 非降序,且[l,k]内值 >= [k,r] 值
当 f[m] < f[r] 时,说明 m 到 r 非降序,最小值在左边,r = m;
当 f[m] == f[r] 时, r = r -1 ;缩小空间
当 f[m] > f[r] 时,说明旋转了,最小值在 [m,r]内, l = m + 1;
假设比较左端点:
当 f[m] < f[l] 时,说明 [m,r] 是非降序,最小值在 [l,m] 中,r = m;
当 f[m] > f[l] 时, 说明 [l,m] 非降序 (可能没有旋转,可能旋转),结果 可能 在左边
可能在右边,无法判断是否旋转
class Solution {
public:
int minNumberInRotateArray(vector<int> rotateArray) {
int l = 0,r = rotateArray.size()-1;
while(l < r){
int m = l + (r - l)/2;
if(rotateArray[m] > rotateArray[r]){
l = m + 1;
}else if(rotateArray[m] == rotateArray[r]){
r = r-1;
}else{
r = m;
}
}
return rotateArray[l];
}
};