方法:二分法
题设中的条件:非降序的数组进行旋转。非降序说明数组是升序数组且可能有重复元素。
通过观察可以得到:对于一个非降序的数组,取数组的中间元素与数组最右边的元素进行比较,如果中间元素大于最右边元素,最小值一定在中点右侧(不包括中点);如果中间元素小于最右边元素,最小值一定在中点左侧(包括中点);如果中间元素等于最右边元素,这时无法判断在哪一侧,但是可以将最右侧元素筛除掉。
时间复杂度:o(logn)
空间复杂度:o(1)
class Solution { public: int minNumberInRotateArray(vector<int>& nums) { //特殊情况处理 if (nums.size() == 1) return nums[0]; int left = 0; int right = nums.size() - 1; int mid; while (left <= right) { mid = (left + right) / 2; //中点大于最右侧时,最小值一定在中点右侧 if (nums[mid] > nums[right]) left = mid + 1; //中点小于最右侧时,最小值可能为中点或者在中点的左侧 else if (nums[mid] < nums[right]) right = mid; //中点等于最右侧时,无法判断在哪一侧 else right--; } return nums[mid]; } };