题目:搜索旋转排序数组

一开始的想法是:先遍历一遍旋转后的数组,分别找到两个各自单调的子数组,之后对这两个数组分别进行二分查找;但这会导致线性的时间复杂度,而不是题目要求的logn

而下面这种方法就是不通过遍历,直接在二分查找中对有序的子数组进行判断

具体实现:

仍然是先定义左右边界(左闭右开),之后进入循环

当mid对应的值恰好与target相等时,则mid就是我们要找的下标

若是不等,则根据当前中点值与最右值得比较结果,对左数组与右数组进行选择

之后再在这两个子数组中进行二分查找

 1int search(vector<int>& nums, int target)
 2{
 3    int left = 0, right = nums.size() - 1;
 4    while(left <= right)
 5    {
 6        int mid = left + (right - left) / 2;
 7        if(nums[mid] == target)
 8            return mid;
 9        else if(nums[left] <= nums[mid])
10        {
11            // 进入左数组
12            if(nums[left] <= target && target < nums[mid])
13                right = mid;
14            else
15                left = mid + 1;
16        }
17        else
18        {
19            //进入右数组
20            if(nums[mid] < target && target <= nums[right])
21                left = mid + 1;
22            else
23                right = mid;
24        }
25    }
26    return -1;
27}