算法题21:旋转数组的最小数字
思路:二分法
- mid比右端大则表示mid在前半部分,left = mid + 1;
- mid比右端小则表示mid在后半部分,right = mid;
- 若mid和右端值相等,则right减一缩小范围。
代码
int minNumberInRotateArray(vector<int> rotateArray) {
// 二分法,mid比右端大则表示mid在前半部分,left = mid + 1;
// mid比右端小则表示mid在后半部分,right = mid;
// 若mid和右端值相等,则right--缩小范围
int left = 0;
int right = rotateArray.size() - 1;
int mid = 0;
while(left <= right) {
mid = (left + right)/2;
if(rotateArray[mid] > rotateArray[right]){
left = mid + 1;
}
else if(rotateArray[mid] < rotateArray[right]){
right = mid; // 最小值也可能取到mid
}
// 若相等无法明确最小值范围,则缩小范围
else right--;
}
return rotateArray[mid];
}