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 };

 

posted @ 2020-03-17 17:58  Jinxiaobo0509  阅读(113)  评论(0)    收藏  举报