剑指 Offer 11. 旋转数组的最小数字
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如,数组
[3,4,5,1,2]为[1,2,3,4,5]的一个旋转,该数组的最小值为1。
示例 1: 输入:[3,4,5,1,2] 输出:1 示例 2: 输入:[2,2,2,0,1] 输出:0 注意:本题与主站 154 题相同:https://leetcode-cn.com/problems/find-minimum-in-rotated-sorted-array-ii/
解题思路
二分
1.暴力解法
class Solution {public:int minArray(vector<int>& numbers) {int min = INT_MAX;for(int i=0;i<numbers.size();i++)if(numbers[i] < min)min = numbers[i];return min;}};
2.二分
旋转数组后可能的三种情形
情形1 情形2 情形3

- 情形1,最小值在左边,numbers[mid] < numbers[right],right向左
- 情形2和3,最小值在右边,numbers[mid] > numbers[right],left向右
- 当 numbers[mid] == numbers[right] 时,right—,即向左收缩
class Solution {public:int minArray(vector<int>& numbers) {int left = 0;int right = numbers.size() -1;while(left < right) {int mid = left + ((right - left) >> 1);if(numbers[mid] < numbers[right]) right = mid;else if(numbers[mid] > numbers[right]) left = mid + 1;else right--;}return numbers[left];}};
