您的位置:首页 > 其它

LeetCode OJ 之 Search in Rotated Sorted Array (有序数组翻转后的查找)

2014-12-18 10:37 549 查看

题目:

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.。假设没有重复的数。

思路:

先参看查找有序数组中的最小值:http://blog.csdn.net/u012243115/article/details/41923667

本题依然使用二分法,难点在于如何判断  target  在前半段还是后半段。对于无重复的数组4 5 6 7 0 1 2,如果满足 A[begin]
<= A[mid] ,即数组的第一个值小于中间值 4 < 7 ,那么可以断定前半段数组有序。如果不满足这个条件,(比如:4 5 0 1 2) 则说明后半段有序。因为把这个数组从中间分开后,一定至少有半个数组是有序的。然后再判断 target 是否在有序的半段中(这个很好判断),如果在,则相当于在有序数组中查找,很简单。如果不在有序的那半段,则一定在另外半段里。然后使用迭代即可把target找出。

代码:

class Solution {
public:
int search(int A[], int n, int target)
{
int begin = 0;
int end = n-1;
while(begin <= end)
{
int mid = (begin + end)/2;
//判断mid是否为target,如果是,直接返回,如果不是,再判断target是在前半段还是后半段
if(A[mid] == target)
{
return mid;
}
//如果前半段有序
if(A[begin] <= A[mid])
{
//判断target是否在前半段,如果在,则继续遍历前半段,如果不在,则继续遍历后半段
if(A[begin] <= target && target < A[mid])
end = mid - 1;
else
begin = mid + 1;
}
//else说明后半段有序
else
{
//判断target是否在后半段,如果在,则继续遍历后半段,如果不在后半段,则继续遍历前半段
if(A[mid] < target && target <= A[end])
begin = mid + 1;
else
end = mid - 1;
}
}
return -1;
}

};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐