您的位置:首页 > 其它

LeetCode @ Search in Rotated Sorted Array 旋转数组查找

2014-07-14 06:13 507 查看
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.

来源于Code_Ganker:http://blog.csdn.net/linhuanmars/article/details/20525681

1.my_idea:因为是旋转数组,则一定至少有一半是有序的

2."因为rotate,当我们切取一半的时候可能会出现误区,所以要进一步判断。每次迭代中,分三种情况:"

(1)如果target==A[mid],直接返回mid;

(2)如果A[mid]<A[right],那么(mid,right)一定有序;进一步如果target属于有序区间(A[mid],A[right]】,则left=mid+1,否则target在leftHalf,则right=mid-1。

(3)如果A[mid]>=A[right],那么(mid,right)一定无序,既从left到mid有序;进一步如果target属于有序区间【A[left],A[mid]),则right=mid-1,否则在rightHalf,则left=mid+1。

3.每次切掉一半数据,所以算法的时间复杂度是O(logn),空间复杂度是O(1)。

<span style="font-size:12px;">public class Solution {
public int search(int[] A, int target) {
int left=0;
int right=A.length-1;
while(left<=right){
int mid=(left+right)/2;
if(A[mid]==target)   //(1)一定要先写找到的case
return mid;
if(A[mid]<A[right]){ //(2)右边有序
if (A[mid]<target && target<=A[right])//如果在有序区间
left=mid+1;
else
right=mid-1;
}
else{                //(3)左边有序
if(A[left]<=target && target<A[mid])//如果在有序区间
right=mid-1;
else
left=mid+1;
}
}
return -1;
}
}</span>


【后记】这个if判断没有和别的题目统一,所以直接看后面LeetCode二分查找总结就好。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐