1+ // Problem 81, Search in Rotated Sorted Array II
2+
3+ // Follow up for "Search in Rotated Sorted Array":
4+ // What if duplicates are allowed?
5+ // Would this affect the run-time complexity? How and why?
6+ // Write a function to determine if a given target is in the array.
7+ //
8+ // FYI: "Search in Rotated Sorted Array":
9+ // Suppose a sorted array is rotated at some pivot unknown to you beforehand.
10+ // (i.e., 0 1 2 4 5 6 7 might become 4 5 6 7 0 1 2).
11+ // You are given a target value to search. If found in the array return its index, otherwise return -1.
12+ // You may assume no duplicate exists in the array.
13+
14+ #include < stddef.h>
15+ #include < vector>
16+ #include < string.h>
17+ #include < stdio.h>
18+ #include < algorithm>
19+ #include < iostream>
20+ #include < map>
21+
22+ using namespace std ;
23+
24+ class Solution {
25+ public:
26+ bool search (vector<int >& nums, int target) {
27+
28+ int start = 0 ;
29+ int end = nums.size ()-1 ;
30+
31+ while (start <= end){
32+ // skip the repeating numbers on both sides
33+ while (start < end && nums[start] == nums[start + 1 ]) start++;
34+ while (start < end && nums[end] == nums[end - 1 ]) end--;
35+
36+ int mid = (start + end)/2 ;
37+ if (nums[mid] == target) return true ; // found
38+ if (nums[mid] < target){
39+ // for cases like {6 7 0 1 2 4 5} mid is 1, start is 6, end is 5, target is 2
40+ // and cases like {2 4 5 6 7 0 1} mid is 6, start is 2, end is 1, target is 7
41+ if (nums[start] > target || nums[mid] >= nums[start])
42+ start = mid + 1 ;
43+ else
44+ end = mid - 1 ;
45+ }
46+ else {
47+ // for cases like {4 5 6 7 0 1 2}, mid is 7, start is 4, end is 2, target is 5
48+ // and cases like {6 7 0 1 2 4 5}, mid is 1, start is 6, end is 5, target is 0
49+ if (nums[start] <= target || nums[mid] < nums[start])
50+ end = mid - 1 ;
51+ else
52+ start = mid + 1 ;
53+ }
54+ }
55+ return false ;
56+ }
57+ };
58+ int main ()
59+ {
60+ Solution* sol = new Solution ();
61+ vector<int > nums;
62+ nums.push_back (4 );
63+ nums.push_back (5 );
64+ nums.push_back (6 );
65+ nums.push_back (7 );
66+ nums.push_back (0 );
67+ nums.push_back (1 );
68+ nums.push_back (2 );
69+
70+ cout<<sol->search (nums,3 )<<endl;
71+ cout<<sol->search (nums,0 )<<endl;
72+ cout<<sol->search (nums,6 )<<endl;
73+ cout<<sol->search (nums,5 )<<endl;
74+
75+ char c;
76+ cin>>c;
77+
78+ return 0 ;
79+ }
0 commit comments