详细思路

二分,先判断mid,不行,如果0到mid有序,此时如果target在left到mid之间,right去左边,否则,left去右边,同理mid到n-1有序
 
精确定义
left左边数组第一个
mid左边数组最后一个,右边数组第一个
right右边数组最后一个
class Solution {
public:
    int search(vector<int>& nums, int target) {
        int n=nums.size();
        if(n==1)return nums[0]==target?0:-1;
        int left=0,right=n-1;
        while(left<=right){
            int mid=left+(right-left)/2;
            if(nums[mid]==target)return mid;
            if(nums[0]<=nums[mid]){
                if(nums[left]<=target&&target<nums[mid])right=mid-1;
                else left=mid+1;
            }
            else if(nums[mid]<=nums[n-1]){
                if(nums[mid]<target&&target<=nums[right])left=mid+1;
                else right=mid-1;
            }
        }
        return -1;
    }
};
踩过的坑
 while(left<=right){
 if(nums[0]<=nums[mid]){
posted on 2021-07-27 19:59  offer快到碗里来~  阅读(30)  评论(0)    收藏  举报