1. 程式人生 > >28.earch in Rotated Sorted Array(排序旋轉數組中查找)

28.earch in Rotated Sorted Array(排序旋轉數組中查找)

題目 arch runtime urn sts must bin num arr

Level:

??Medium

題目描述:

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.

Your algorithm‘s runtime complexity must be in the order of O(log n).

Example 1:

Input: nums = [4,5,6,7,0,1,2], target = 0
Output: 4

Example 2:

Input: nums = [4,5,6,7,0,1,2], target = 3
Output: -1

思路分析:

??有序旋轉數組,設置兩個指針,left和right,分別指向數組的左端和右端,求數組的mid,如果mid的值大於left的值,那麽旋轉點在mid後面,如果小於left,則證明旋轉點在mid前面。

??如果旋點在mid的後面,並且target的值大於left處的值,小於mid處的值,那麽接下來就可以在left到mid之間進行二分查找target,否則對mid+1到right這部分數組進行遞歸操作。

??如果旋點在mid的前面,並且target的值大於mid處的值,小於right處的值,那麽接下來就可以在mid到right之間進行二分查找target,否則對left到mid-1這部分數組進行遞歸操作。

代碼:

public class Solution{
    public int search(int []nums,int target){
        if(nums==null||nums.length==0)
            return -1;
        int res=find(nums,0,nums.length-1,target);
        return res;
    }
    public int find(int []nums,int left,int right,int target){
        if(nums[left]==target)
            return left;
        if(nums[right]==target)
            return right;
        int mid=(left+right)/2;
        if(nums[mid]==target)
            return mid;
        if(left>right)
            return -1;
        if(nums[mid]>nums[left]){ //證明旋轉點在mid後面
            if(target>nums[left]&&target<nums[mid]){
                return binarySearch(nums,left,mid-1,target);
            }else{
                return find(nums,mid+1,right,target);
            }
            
        }
        if(nums[mid]<nums[left]){ //證明旋轉點在mid的前面
            if(target>nums[mid]&&target<nums[right]){
                return binarySearch(nums,mid+1,right,target);
            }else{
                return find(nums,left,mid-1,target);
            }
        }
        return -1;
    }
    public int binarySearch(int []nums,int left,int right,int target){
        if(left<=right){
            int mid=(left+right)/2;
            if(nums[mid]==target)
                return mid;
            if(target>nums[mid]){
                return binarySearch(nums,mid+1,right,target);
            }
            if(target<nums[mid]){
                return binarySearch(nums,left,mid-1,target);
            }
        }
        return -1;
    }
}

28.earch in Rotated Sorted Array(排序旋轉數組中查找)