一. 题目

二. 思路

三. 代码

class Solution
{
    int tfind(int[] a, int l, int r, int x)
    {
        while (l < r)
        {
            int mid = (l + r) / 2;
            if (a[l] <= a[mid])//左边有序
            {
                if (x >= a[l] && x <= a[mid]) r = mid;//是否在有序范围
                else l = mid + 1;
            } else//右边有序
            {
                if (x >= a[mid + 1] && x <= a[r]) l = mid + 1;//是否在有序范围
                else r = mid;
            }
        }

        if (a[l] == x) return l;
        return -1;
    }

    public int search(int[] nums, int target)
    {
        return tfind(nums, 0, nums.length - 1, target);
    }
}
class Solution
{
    int tfind(int[] a, int l, int r, int x)
    {
        int preMid = -1;
        while (l < r)
        {
            int mid = (l + r + 1) / 2;
            if (preMid == mid)
            {
                if (a[l] == x) return l;
                if (a[r] == x) return r;
                break;
            }
            preMid = mid;

            if (a[l] <= a[mid])
            {
                if (x >= a[l] && x <= a[mid]) r = mid;
                else l = mid + 1;
            } else
            {
                if (x >= a[mid] && x <= a[r]) l = mid;
                else r = mid - 1;
            }
        }

        return l < a.length && a[l] == x ? l : -1;
    }

    public int search(int[] nums, int target)
    {
        return tfind(nums, 0, nums.length - 1, target);
    }
}
class Solution
{
    int tfind(int[] a, int l, int r, int x)
    {
        while (l < r)
        {
            int mid = (l + r + 1) >> 1;
            if (a[mid] == x) return mid;
            if (a[mid] < x)
            {
                if (a[l] < a[r]) l = mid + 1;
                else
                {
                    if (a[mid] > a[l]) l = mid + 1;//mid在大段
                    else//mid在小段
                    {
                        if (a[r] < x) r = mid - 1;
                        else l = mid + 1;
                    }
                }
            } else if (a[mid] > x)
            {
                if (a[mid] < a[r]) r = mid - 1;//mid在小段
                else //mid在大段
                {
                    if (a[l] > x) l = mid + 1;
                    else r = mid - 1;
                }
            }
        }

        return l < a.length&&a[l] == x ? l : -1;
    }

    public int search(int[] nums, int target)
    {
        return tfind(nums, 0, nums.length - 1, target);
    }
}