假设有一个数列,它是一个有序数列围绕某个点旋转得到的。要求写算法在该数列中查找某给定数,看是否存在,存在则返回其位置。
直接从前到后扫描整个数组,时间复杂度最优O(1),最坏O(n)。
public static int bfSearch(int[]arr,int target){
    for(int i=0;i<arr.length;i++){
        if(arr[i]==target){
            return i;
        }
    }
    return -1;
}
利用数组的有序性,可以想到二分查找,但由于原来有序的数组绕某个点旋转过,因此需要对二分查找进行变形。
class Solution {
    public int search(int[] nums, int target) {
        return binarySearchRecursion(nums,target,0,nums.length-1);
    }
    private int binarySearchRecursion(int[]arr,int target,int begin,int end){
        if(end < begin){
            return -1;
        }
        int mid = (begin+end)/2;
        if(arr[mid]==target){
            return mid;
        }else if(arr[0]<=arr[mid]){//mid的左边未旋转,优先处理左边
            if(target>=arr[0]&&target<arr[mid]){
                return binarySearchRecursion(arr,target,begin,mid-1);
            }else{
                return binarySearchRecursion(arr,target,mid+1,end);
            }
        }else{//mid的左边跨越两段,可以说明mid右边未旋转,优先处理右边
            if(target>arr[mid]&&target<=arr[arr.length-1]){
                return binarySearchRecursion(arr,target,mid+1,end);
            }else{
                return binarySearchRecursion(arr,target,begin,mid-1);
            }
        }
    }
}
时间复杂度为O(logn)。
原文:https://www.cnblogs.com/hickey2048/p/14604779.html