1 static int wing=[]() 2 { 3 std::ios::sync_with_stdio(false); 4 cin.tie(NULL); 5 return 0; 6 }(); 7 8 class Solution 9 { 10 public: 11 int search(vector<int>& nums, int target) 12 { 13 int sz=nums.size(); 14 if(sz==0) 15 return -1; 16 int flag= (nums[0]<=target)? 0:1; 17 int left=0,right=sz-1; 18 if(flag==0) 19 { 20 while(left<right) 21 { 22 int mid=left+((right-left)>>1); 23 int flagmid= (nums[mid]>=nums[0])? 0:1; 24 if(flagmid==0) 25 { 26 if(nums[mid]==target) 27 return mid; 28 else if(nums[mid]>target) 29 right=mid; 30 else 31 left=mid+1; 32 } 33 else 34 right=mid-1; 35 } 36 return (nums[left]==target? left:-1); 37 } 38 else 39 { 40 while(left<right) 41 { 42 int mid=left+((right-left)>>1); 43 int flagmid= (nums[mid]>=nums[0])? 0:1; 44 if(flagmid==1) 45 { 46 if(nums[mid]==target) 47 return mid; 48 else if(nums[mid]>target) 49 right=mid; 50 else 51 left=mid+1; 52 } 53 else 54 left=mid+1; 55 } 56 return (nums[left]==target? left:-1); 57 } 58 } 59 };
分块,分情况讨论,目标值和mid在一个区则查找,否则更新两端指针
方法二简单一些,这种方法把情况整合了一下,处理步骤相同的几种情况合在一起处理
1 class Solution 2 { 3 public: 4 int search(vector<int>& nums, int target) 5 { 6 int left=0,right=nums.size()-1,mid; 7 while(left<=right) 8 { 9 mid=left+((right-left)>>1); 10 int cur=nums[mid]; 11 if(cur==target) 12 return mid; 13 if(cur>=nums[left]) 14 { 15 if(target>=nums[left]&&target<cur) 16 right=mid; 17 else 18 left=mid+1; 19 } 20 else 21 { 22 if(target>cur&&target<=nums[right]) 23 left=mid+1; 24 else 25 right=mid; 26 } 27 } 28 return -1; 29 } 30 };