剑指offer | 旋转数组的最小数字 | 07

思路分析

只能说这个是一个很经典的二分题目.

如上图所示,排序数组进行旋转之后,右排序数组的值都是小于或等于左排序数组的.

需要注意,需要要右边排序数组相等的部分隐去,这样才能进行二分操作.

二分写法

cpp

class Solution {
public:
    int minNumberInRotateArray(vector<int> rotateArray) {
        vector<int> (&nums) = rotateArray;
        if(nums.empty())return 0;
        int n = nums.size()-1;
        while(n>0 && nums[0]==nums[n])n--; // 去除右排序数组的相等部分
        if(nums[n]>nums[0])return nums[0]; // 右排序数组被删完了
        int l=0,r=n;
        while(l<r){
            int mid = l+r>>1;
            if(nums[0]>nums[mid])r=mid;
            else l = mid+1;
        }
        return nums[r];
        
    }
};

python

# -*- coding:utf-8 -*-
class Solution:
    def minNumberInRotateArray(self, rotateArray):
        nums = rotateArray
        if not nums:return 0
        n = len(nums)-1
        while n>0 and nums[0]==nums[n]:n-=1
        if nums[n]>nums[0]:return nums[0]
        l,r=0,n
        while l<r:
            mid = l+r>>1
            if nums[0]>nums[mid]:r=mid
            else: l=mid+1
        return nums[l]
            
原文地址:https://www.cnblogs.com/Rowry/p/14305309.html