剑指 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.暴力解法

  1. class Solution {
  2. public:
  3. int minArray(vector<int>& numbers) {
  4. int min = INT_MAX;
  5. for(int i=0;i<numbers.size();i++)
  6. if(numbers[i] < min)
  7. min = numbers[i];
  8. return min;
  9. }
  10. };

2.二分

旋转数组后可能的三种情形
情形1 情形2 情形3
图片.png 图片.png 图片.png

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