33. Search in Rotated Sorted Array
Suppose an array sorted in ascending order 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.
Solituon:
class Solution {
2
public:
3
int search(vector<int>& nums, int target) {
4
if (nums.size() == 0) return -1;
5
if (nums.size() == 1) return (target == nums[0] ? 0 : -1);
6
int i = 0, j = nums.size()-1, d = 0, n = nums.size();
7
while (nums[i] > nums[j]) {
8
if (i+1 == j) {
9
d = j; break;
10
}
11
if (nums[(i+j)/2] > nums[j]) i = (i+j)/2;
12
else j = (i+j)/2;
13
}
14
i = 0, j = nums.size()-1;
15
while (i <= j) {
16
if (nums[((i+j)/2+d)%n] == target) return ((i+j)/2+d)%n;
17
else if (nums[((i+j)/2+d)%n] < target) i = (i+j)/2+1;
18
else j = (i+j)/2-1;
19
}
20
return -1;
21
}
22
};