33. 搜索旋转排序数组
一、如果左边有序
1、target小于中点的值且小于起点的值:l = mid + 1
2、target小于中点的值且大于等于起点的值:r = mid - 1
3、target大于中点的值:l = mid + 1
二、如果右边有序
1、target大于中点的值且小于等于终点的值:l = mid + 1
2、target大于中点的值且大于终点的值:r = mid - 1
3、target小于中点的值:r = mid - 1
1 class Solution 2 { 3 public: 4 int search(vector<int>& nums, int target) 5 { 6 int l = 0, r = nums.size()-1; 7 while(l <= r) 8 { 9 //处理重复数字 10 while(l < r && nums[l] == nums[l + 1]) ++l; 11 while(l < r && nums[r] == nums[r - 1]) --r; 12 int mid = l + (r - l)/ 2; 13 if(nums[mid] == target) return mid; 14 //左半部分有序 15 if(nums[mid] >= nums[l]) 16 { 17 if(target <= nums[mid] && target >= nums[l]) r = mid - 1;//target落在左半边 18 else l = mid + 1; 19 } 20 else//右半部分有序 21 { 22 if(target >= nums[mid] && target <= nums[r]) l = mid + 1;//target落在右半边 23 else r = mid - 1; 24 } 25 } 26 return -1; 27 } 28 };
1 class Solution 2 { 3 public: 4 int search(vector<int>& nums, int target) 5 { 6 if(nums.empty()) return -1; 7 8 //找到最小值 9 int l = 0,r = nums.size() - 1; 10 while(l < r) 11 { 12 int mid = l + r >> 1; 13 if(nums[mid] <= nums.back()) r = mid; 14 else l = mid + 1; 15 } 16 17 if(target <= nums.back()) r = nums.size() - 1; 18 else l = 0,r --; 19 20 //二分模板1 21 while(l < r) 22 { 23 int mid = (l + r) >> 1; 24 if(nums[mid] >= target) r = mid; 25 else l = mid + 1; 26 } 27 if(nums[l] != target) return -1; 28 return l; 29 } 30 };
    Mamba never out
 
                    
                
 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号