您的位置:首页 > 其它

33. Search in Rotated Sorted Array

2017-10-18 21:15 477 查看
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。我们还是考虑二分搜索法,但是这道题的难点在于我们不知道原数组在哪旋转。



方法一:

int SearchInRotatedSortedArray::search1(vector<int>& nums, int target)
{
return searchFrom(nums, target, 0, nums.size() - 1);
}

int SearchInRotatedSortedArray::searchFrom(vector<int>& nums, int target, int begin, int end)
{
if (begin > end) return -1;
int indexMid = (begin + end) / 2;
int valueMid = nums[indexMid];
if (valueMid == target)
{
return indexMid;
}
else if (valueMid > target)
{
if (target > nums[end])
{
return searchFrom(nums, target, begin, indexMid - 1);
}
else
{
int value = searchFrom(nums, target, begin, indexMid - 1);
return value == -1 ? searchFrom(nums, target, indexMid + 1, end) : value;
}
}
else if (valueMid < target)
{
if (target < nums[begin])
{
return searchFrom(nums, target, indexMid + 1, end);
}
else
{
int value = searchFrom(nums, target, begin, indexMid - 1);
return value == -1 ? searchFrom(nums, target, indexMid + 1, end) : -1;
}
}
}


方法二:

int SearchInRotatedSortedArray::search2(vector<int>& A, int target) {
int l = 0;
int r = A.size() - 1;
while (l <= r) {
int mid = (l + r) / 2;
if (target == A[mid]) return mid;
if (A[l] <= A[r]) {
if (target < A[mid]) r = mid - 1;
else l = mid + 1;
}
else if (A[l] <= A[mid]) {
if (target > A[mid] || target < A[l]) l = mid + 1;
else r = mid - 1;
}
else {
if (target < A[mid] || target > A[r]) r = mid - 1;
else l = mid + 1;
}
}
return -1;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  leetcode SearchInRo