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.

错误的二分查找

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
int binarySearch(vector<int> v, int begin, int end, int target)
{
int mid = (begin + end) / 2;
while (begin < end)
{
if (v[mid] == target)
return mid;
else if (v[mid] > target)
{
end = mid;
} else
{
begin = mid;
}
mid = (begin + end) / 2;
}
return -1;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
class Solution {
public:
int binarySearch(vector<int> &v, int begin, int end, int target)
{
int mid = (begin + end) / 2;
while (begin <= end)
{
if (v[mid] == target)
return mid;
else if (v[mid] > target)
{
end = mid - 1;
} else
{
begin = mid + 1;
}
mid = (begin + end) / 2;
}
return -1;
}

int search(vector<int> &nums, int target)
{
if (!nums.size())
return -1;
int i = 0, j = nums.size() - 1;
int mid = (i + j) / 2;
if (nums[i] < nums[j])
i = j;
else
{
int mid = (i + j) / 2;
while (i < j)
{
if (nums[i] < nums[mid])
i = mid;
else
j = mid;
mid = (i + j) / 2;
}
}

//now i the max value index
if (i == nums.size() - 1)
{
return binarySearch(nums, 0, nums.size() - 1, target);
} else
{
if (target >= nums[0])
return binarySearch(nums, 0, i, target);
else
{
return binarySearch(nums, i + 1, nums.size() - 1, target);
}
}
}
};