题目:https://oj.leetcode.com/problems/search-in-rotated-sorted-array/
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.
分析(转自 http://www.2cto.com/kf/201403/288785.html):有序数组的查找直接使用二分查找很方便,所以旋转之后的数组要利用二分搜索的原理需要判断哪一部分仍然是有序的,然后确定在哪一部分继续搜索。具体判断方法如下:
(1)如果target==A[mid],那么mid就是我们要的结果,直接返回;
(2)如果A[begin]<=A[mid],那么说明从begin到mid一定是有序的,同样只需要判断target是否在这个范围内,如果是则把右边缘移到mid-1,否则就target在另一半,即把左边缘移到mid+1。
(3)如果A[begin]>A[mid],那么说明从mid到last一定是有序的(没有受到rotate的影响),那么我们只需要判断target是不是在mid到last之间,如果是则把左边缘移到mid+1,否则就target在另一半,即把右边缘移到mid-1。
源码:Java版本
算法分析:时间复杂度O(logn),空间复杂度O(1)。
public class Solution { public int search(int[] A, int target) { if(A.length==0) { return -1; } int low,middle,high; low=0; high=A.length-1; while(low<=high) { middle=(low+high)>>1; if(A[middle]==target) { return middle; } if(A[low]<=A[middle]) { if(A[low]<=target && target<A[middle]) { high=middle-1; }else { low=middle+1; } }else { if(A[middle]<target && target<=A[high]) { low=middle+1; }else { high=middle-1; } } } return -1; } }