剑指offer-旋转数组的最小数字
二分,注意边界
其实就是数组有两部分,都是升序的,左边部分都比右边部分大,暂且称左序列和右序列
所以当 left 指向的元素比 mid 值小,说明是指向了左序列,左指针右移,left=mid
当 right 指向的元素比 mid 的大, 说明是指向了右序列,右指针左移, right = mid
这样向中间靠,当左右指针相邻的时候退出循环,2个值小的那个就是答案
还有一种偷鸡法,直接找最小值
class Solution { public: int minNumberInRotateArray(vector<int> rotateArray) { if(rotateArray.size() == 0){ return 0; } int left, right, mid; left = 0, right = rotateArray.size() - 1; while(right - left != 1){ mid = (left + right) / 2; if(rotateArray[mid] >= rotateArray[left]){ left = mid; } if(rotateArray[mid] <= rotateArray[right]){ right = mid; } } return min(rotateArray[left], rotateArray[right]); } };