方法:二分法
题设中的条件:非降序的数组进行旋转。非降序说明数组是升序数组且可能有重复元素。
通过观察可以得到:对于一个非降序的数组,取数组的中间元素与数组最右边的元素进行比较,如果中间元素大于最右边元素,最小值一定在中点右侧(不包括中点);如果中间元素小于最右边元素,最小值一定在中点左侧(包括中点);如果中间元素等于最右边元素,这时无法判断在哪一侧,但是可以将最右侧元素筛除掉。
时间复杂度: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];
}
};

京公网安备 11010502036488号