| 大 | 小 |
mid
mid
class Solution {
public:
int minNumberInRotateArray(vector<int> rotateArray) {
int left=0,right=rotateArray.size()-1;
while(left<right){
if(rotateArray[left]<rotateArray[right])
return rotateArray[left];
int mid=left+((right-left)>>1);
//因为旋转数组是两端递增的子序列,左大右小,所以mid与右端点比较找最小,如最上边那个示意图
//如果mid比右端点大则说明当前mid在较大的递增序列中,所以最小值在mid的右边
//又因为mid在较大区间所以mid不可能为最小值,所以该区间不包含mid
//如果mid比右端点小则说明当前mid在较小的等增序列中,所以最小值在mid的左边
//又因为mid在较小区间所以mid可能为最小值,所以该区间包含mid
//如果比右端点大则说明最小值在右边
//如果与右端点相等无法判断最小值位于那边,因为不能确定那边是单调递增的
if(rotateArray[mid]>rotateArray[right]){
left=mid+1;
}
//比右端点小则在左边
else if(rotateArray[mid<rotateArray[right]]){
right=mid;
}else{
//相等的情况无法判断最小元素在哪一边,所以只能缩小区间
right--;
}
}
return rotateArray[left];
}
};
思考?
是否可以和左端点比较,确认区间了? 不能
旋转数组的最小数字
最新推荐文章于 2023-01-31 18:42:28 发布