Search in Rotated Sorted Array

Suppose a sorted array is rotated at some pivot unknown to you beforehand.
(i.e., 0 1 2 4 5 6 7 might become 4 5 6 7 0 1 2).
You are given a target value to search. If found in the array return its index, otherwise return -1.
You may assume no duplicate exists in the array.

 1 int Solution::search(const vector<int>& nums, int target) 
 2 {
 3     // 解题思路:当nums[mid] > nums[last-1]时,
 4     // [first,mid]有序,[mid,last)无序,
 5     // 否则[first,mid]无序,[mid,last)有序,
 6     // 因为当 nums[mid] > target 时,target 可能在mid的左边或者右边,
 7     // 所以还要将target 与 nums[first]对比
 8     int first = 0, last = nums.size();
 9     while(first != last) 
10     {
11         const int mid = first + (last - first) / 2;
12         if(nums[mid] == target)
13             return mid;
14         if(nums[mid] > nums[last-1])
15         {
16             if(nums[mid] > target && target >= nums[first])
17                 last = mid;
18             else
19                 first = mid + 1;
20         } else
21         {
22             if(nums[mid] < target && target <= nums[last-1]) 
23                 first = mid + 1;
24             else
25                 last = mid;
26         }
27     }
28     return -1;
29 }

 

Follow up for ”Search in Rotated Sorted Array”: What if duplicates are allowed?

 1 bool Solution::search2(const vector<int>& nums, int target)
 2 {
 3     int first = 0, last = nums.size();
 4     while(first != last)
 5     {
 6         int mid = first + (last - first) / 2;
 7         if(nums[mid] == target)
 8             return true;
 9         if(nums[mid] < nums[last-1])
10         {
11             if(nums[mid] < target && target <= nums[last-1])
12                 first = mid + 1;
13             else
14                 last = mid;
15         } else if(nums[mid] > nums[last-1]) 
16         {
17             if(nums[mid] > target && target >= nums[first]) 
18                 last = mid;
19             else
20                 first = mid + 1;
21         } else if(nums[mid] == nums[last-1])
22             last--;
23     }
24     return false;
25 }

如果允许重复元素,只需多考虑num[mid] == nums[last-1]时的情况就可以了

posted @ 2018-06-26 22:37  小小Cv  阅读(96)  评论(0编辑  收藏  举报