Search in Rotated Sorted Array

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.

Binary Search

Time Complexity
O(logn)
Space Complexity
O(1)

思路

If target == nums[mid]; return mid;
If target nums[mid] < nums[right], mid to right is sorted, so we just need to know if target is between mid to right.
If target nums[mid] > nums[right], left to mid is sorted, so we just need to know if target is between left to mid.

代码

public int search(int[] nums, int target) {
    if(nums == null || nums.length == 0){
        return -1;
    }
    int start = 0, end = nums.length - 1;
    while(start + 1 < end){
        int mid = start + (end - start)/2;
        if(nums[mid] == target){
            return mid;
        }
        if(nums[mid] < nums[end]){    //right part is sorted
            if(nums[mid] < target && target <= nums[end]){
                start = mid + 1;
            }else{
                end = mid - 1;
            }
        }else if(nums[mid] > nums[end]){   //left part is sorted
            if(nums[start] <= target && target < nums[mid]){
                end = mid - 1;
            }else{
                start = mid + 1;
            }
        }else{
            start++;
        }
    }
    if(nums[start] == target){
        return start;
    }
    if(nums[end] == target){
        return end;
    }
    return -1;
}

annielulu
5 声望5 粉丝