力扣33搜索旋转排序数组

logn的时间复杂度需要2分查找,但是原序列并不是有序递增的,使用递归方法将原序列拆成两份,直到某一分序列是有序递增,且target在大小在该序列的范围中,再使用二分查找法
分成四种情况
1、 10 11 12 | 1 2 3
2、10 11 | 12 1 2 3
3、10 11 12 1 | 2 3
4、1 2 3 | 4 5 6
第一种左右两边分别有序了,判断target在哪边的范围中,就对哪边使用二分查找法,超出范围返回-1
第二种左边有序,target在左边范围中就对左边使用二分查找,如果不在,则对右边的序列使用原方法递归拆成两份
第三种和第二种一样
第四种原序列已经是有序递增,直接使用二分查找
需要注意的特例:原序列为空,返回-1。原序列只有1个元素,拆成两分的时候数组会超界。

class Solution {
public:
    int search(vector& nums, int target){
        if(nums.size()<1)
            return -1;
        else if(nums.size()==1)
            return twodividesearch(nums,target,0,nums.size()-1);
        else
            return func(nums,target,0,nums.size()-1);
    }
    int func(vector& nums,int target,int begin,int end)
    {
        cout<<"nums:"<nums[rightbegin])//left side and right side is ordered separetly;
            {
                cout<<"2"<=nums[leftbegin])
                    return twodividesearch(nums,target,leftbegin, leftend);
                else if(target<=nums[rightend]&&target>=nums[rightbegin])
                    return twodividesearch( nums, target, rightbegin, rightend);
                else 
                    return -1;
             
            }
            else
            {
                cout<<"3"<=nums[rightbegin])
                        return twodividesearch(nums, target, rightbegin, rightend);
                    else
                        return func( nums, target, leftbegin, leftend);
                }
                else//left side is ordered;
                {
                    cout<<"4"<=nums[leftbegin])
                        return twodividesearch( nums, target, leftbegin, leftend);
                    else
                        return func( nums, target, rightbegin, rightend);
                }
            }
        }
    }
    int twodividesearch(vector& nums,int target,int begin,int end)
    {
        cout<<"nums:"<target)
            {
                end=mid-1;
            }
            else
                begin=mid+1;
        }
        return -1;
    }
};

你可能感兴趣的:(笔记)