题目描述
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如,数组 [3,4,5,1,2] 为 [1,2,3,4,5] 的一个旋转,该数组的最小值为1。
示例
输入:[3,4,5,1,2]
输出:1
输入:[2,2,2,0,1]
输出:0
解题思路
经典的二分查找。(当然可以排好序在返回第一个数字,但是这么做时间复杂度为O(n^2))。
- mid < high,说明最小值在左半部分。
- 如果mid > high,那么说明最小值在右侧。
- 如果mid = high,因为是跟high进行比较,所以我们只需high-1即可。
代码
class Solution {
public:
int minArray(vector<int>& numbers) {
int low = 0;
int high = numbers.size() - 1;
while (low < high) {
int mid = (low + high) / 2;
if (numbers[mid] < numbers[high]) {
high = mid;
} else if (numbers[mid] > numbers[high]) {
low = mid + 1;
} else {
high -= 1;
}
}
return numbers[low];
}
};
总结
在代码中可以看到第一种情况并没有进行high-1的操作,是因为我们是拿high来作比较,如果出现像[2,1,2]之类的数组会严重影响结果,但是low无需这么做,如果mid + 1是最小值不会影响结果。