思路分析
只能说这个是一个很经典的二分题目.
如上图所示,排序数组进行旋转之后,右排序数组的值都是小于或等于左排序数组的.
需要注意,需要要右边排序数组相等的部分隐去,这样才能进行二分操作.
二分写法
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]