33. 搜索旋转排序数组

假设按照升序排序的数组在预先未知的某个点上进行了旋转。

( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。

搜索一个给定的目标值,如果数组中存在这个目标值,则返回它的索引,否则返回 -1 。

你可以假设数组中不存在重复的元素。

你的算法时间复杂度必须是 O(log n) 级别。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/search-in-rotated-sorted-array
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
看到复杂度要求必然是二分法 递归
递归结束条件就是左右重合
对于如何判断分界点位置 只需要比较nums[mid]与nums[0]的大小;
递归过程中可能出现mid 与 left相等 要加上判断条件
target>nums[mid] 要判断target到底在哪个区域 判断nums[mid]与nums[0] 注意 如果nums[mid] 同理 target

class Solution {
    static int twoSearch(int [] nums,int target,int left,int right)
    {
        if(left==right&&nums[right]==target)
            return left;
        else if(left==right&&nums[right]!=target)
            return -1;
        else {
            int mid=(left+right)/2;
            if(target==nums[mid])
                return mid;
           else if(target>nums[mid])
            {
               if(nums[mid]>nums[0])
                   return twoSearch(nums,target,mid+1,right);
                else
                {
                    if(nums[right]==target)
                        return right;
                    else if(nums[right]>target)
                        return twoSearch(nums,target,mid+1,right);
                    else 
                        return twoSearch(nums,target,left,mid);
                }
            }
            else
            {
                if(nums[mid]>nums[0])
                {
                    if(nums[left]==target)
                        return left;
                    else if(nums[left]>target)
                        return twoSearch(nums,target,mid+1,right);
                    else return twoSearch(nums,target,left,mid);
                }
                else if(nums[mid]==nums[left])
                   return twoSearch(nums,target,mid+1,right);
                else
                    return twoSearch(nums,target,left,mid);
            }
        }
            
    }
    public int search(int[] nums, int target) {
        if(nums.length==0)
            return -1;
        if(nums.length==1)
        {
            if(nums[0]==target)
                return 0;
            else
                return -1;
        }
       return twoSearch(nums,target,0,nums.length-1);
    }
}

你可能感兴趣的:(leetcode)