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; } };
分析:
一开始我没有想到全部的案例,在有限的案例下想到一个一般但不足以解决全部案例的想法,后来提交有错时不停加条件,发现越来越乱,于是重新想了个思路。
可是太恶心了啊,好难想到全部的案例!!
尤其是这种数组题。
饶命啊。