leecode第三十三题(搜索旋转排序数组)

class Solution {
public:
    int search(vector<int>& nums, int target) {
        int len=nums.size();
        
        if(len==0)//两种输入的特殊情况
            return -1;
        if (len==1)
            return (target==nums[0])? 0:-1;
        
        int start=0,end=len-1;
        while(start<=end)
        {
            int mid=(end-start)/2+start;
            if(nums[mid]==target)//两种循环中的特殊情况
                return mid;
            if(start==end)
                return -1;
            else if(nums[end]>nums[start])//如果是没有旋转的情况,比较好说
            {
                if(nums[mid]>target)
                    end=mid;
                else if(nums[mid]<target)
                    start=mid+1;
            }
            else if(nums[end]<nums[start])//如果是旋转的情况
            {
                if(nums[mid]>=nums[start] && (nums[mid]<target || target<nums[start]))//如果中间值往左都是升序的,判断这个里面有没有值
                    start=mid+1;
                else if(nums[mid]>=nums[start])//不存在就舍弃这段,不然就保留,但是要记得这里>=,因为二者有可能重叠,且上面不会有百分之百处理这个情况的
                    end=mid;
                if(nums[mid]<nums[end] && (nums[mid]>target || target>nums[end]))//如果中间值往右都是升序的,判断这个里面有没有值
                    end=mid;
                else if(nums[mid]<nums[end])//这里不用加=,因为如果相等说明start=end,上面就return了
                    start=mid;
            }
        }
        
        return -1;
    }
};

 

 分析:

一开始我没有想到全部的案例,在有限的案例下想到一个一般但不足以解决全部案例的想法,后来提交有错时不停加条件,发现越来越乱,于是重新想了个思路。

可是太恶心了啊,好难想到全部的案例!!

尤其是这种数组题。

饶命啊。

posted @ 2019-03-24 16:29  深夜十二点三十三  阅读(118)  评论(0编辑  收藏  举报