首先找到旋转位置的索引

根据找到的索引求出旋转的长度,并将数组拼接为原来升序的数组

判断target与数组头尾的大小关系

二分查找target的位置,同时通过之前得到的旋转的长度计算在原始数组中的索引

# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
# 
# @param nums int整型一维数组 
# @param target int整型 
# @return int整型
#
class Solution:
    def search(self , nums: List[int], target: int) -> int:
        # write code here
        idx=-1
        for i in range(len(nums)-1):
            if nums[i+1]<nums[i]:
                idx=i+1
                break

        gap=len(nums)-idx
        if idx!=-1:
            nums=nums[idx:]+nums[:idx]

        if target<nums[0] or target>nums[-1]:
            return -1

        l,r=0,len(nums)-1
        while l<=r:
            mid=(l+r)//2
            if nums[mid]>target:
                r=mid-1
            elif nums[mid]<target:
                l=mid+1
            else:
                if idx!=-1:
                    if mid>=gap:
                        return mid-gap
                    else:
                        return idx+mid
                else:
                    return mid
        return -1