很简单很基础
第一种
我们最先就判断能否直接命中target
保证了后面的判断中target不可能被漏掉 因为mid不可能是target

class Solution(object):
    def findMin(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        l, r = 0, len(nums) - 1
        while l <= r:
            mid = l + ((r - l) >> 1)
            if nums[mid] < nums[mid - 1]: # 数组中唯一一个逆序 序列 找到之后直接返回 数组越界问题? 假设只有一个元素 nums[0] < nums[-1] 此时 nums[-1]合法 表示最后一个元素
                return nums[mid]

            elif nums[mid] < nums[l]: # mid 位于右段 target位于左段
                r = mid - 1
            elif nums[mid] > nums[r]: # mid 位于左段 target位于右段
                l = mid + 1
            else: # 处理只有一个元素的情况 [1]
                return nums[l]

第二种

    def search(self, nums, target):
        # 先去找到旋转数组的最小元素的下标
        left, right = 0, len(nums) - 1
        while left < right: # 思想是一定要等到区间缩小到1 不区判断mid是否可以直接命中
            mid = (left + right) // 2
            if nums[mid] > nums[right]: # mid 位于左段 target必然在右段
                left = mid + 1
            else: # mid位于右段 target位于左段
                right = mid # 一定不能是mid - 1 因为target本身就在右段上面 我们得保证不漏掉target
        
        return left # 此时 mid == left == right