33. 搜索旋转排序数组

package leetcode;

public class demo_33 {
    public int search(int[] nums, int target) {
        int left=0;
        int right=nums.length-1;
        while(left<=right) {
            if(target>nums[right]&&target<nums[left]) {
                return -1;
            }
            int mid=(left+right)/2;
            //如果中间值大于最左边的值,则从最左到中间都是递增的
            if(nums[mid]>=nums[left]) {
                if(nums[mid]>=target) {
                    //判断target是否可能在这个递增区间内
                    if(-1==twodivide(nums,left, mid, target)) {
                        left=mid+1;
                    }
                    else {
                        return twodivide(nums,left, mid, target);
                    }
                }
                else {
                    left=mid+1;
                }
            }
            //如果中间值小于最左边的值,则从中间到最右边都是递增的
            else {
                if(nums[mid]<=target) {
                    //判断target是否可能在这个递增区间内
                    if(-1==twodivide(nums,mid,right, target)) {
                        right=mid-1;
                    }
                    else {
                        return twodivide(nums,mid,right, target);
                    }
                }
                else {
                    right=mid-1;
                }
            }
        }
        return -1;
    }
    //二分查找
    public int twodivide(int nums[],int left,int right,int target) {
        int mid;
        while(left<=right) {
            mid=(left+right)/2;
            if(nums[mid]==target) {
                return mid;
            }
            if(nums[mid]>target) {
                right=mid-1;
            }
            if(nums[mid]<target) {
                left=mid+1;
            }
        }
        return -1;
    }
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        demo_33 d33=new demo_33();
        int[]nums={3,1};
        System.out.println(d33.search(nums, 1));
    }

}

 

posted on 2021-06-11 20:16  一仟零一夜丶  阅读(33)  评论(0)    收藏  举报