【leetcode】(1)33.搜索旋转排序数组

在这里插入图片描述
思路:半排序数组,进行判断,一共四种情况:

  • 数组前半部分有序且目标值在前半数组中
  • 数组后半部分有序且目标值在后半数组中
  • 数组前半部分有序且目标值在后半数组中
  • 数组后半部分有序且目标值在前半数组中
    前两种直接进行二分查找,后两种进行递归。
    public int search(int[] nums, int target) {
        int start = 0;
        int end = nums.length-1;
        int mid = (start+end)/2;
        while (start<=end){
            mid = (start+end)/2;
            if(start == end){
                if(nums[start]==target)
                    return start;
                else
                    return -1;
            }
            if(nums[start]<=nums[mid] && (target<=nums[mid] && target>=nums[start])){//数组前半部分有序且目标值在前半数组中
                return binarySearch(nums,target,start,mid);
            }
            else if(nums[start]>=nums[mid] && (target>=nums[mid] && target<=nums[end])){//数组后半部分有序且目标值在后半数组中
                return binarySearch(nums,target,mid,end);
            }
            else if(nums[start]<=nums[mid] && (target>nums[mid] || target<nums[start])){//数组前半部分有序且目标值在后半数组中
                start = Math.min(mid + 1, end);

            }
            else if((nums[start]>=nums[mid] && (target<nums[mid]) || target>nums[end])){//数组后半部分有序且目标值在前半数组中
                end = Math.max(mid - 1, start);
            }
        }
        return -1;
    }

    private int binarySearch(int[] nums,int target,int low, int high){
        while (low<=high){
            int mid = (high+low)/2;
            if(nums[mid]>target)
                high = mid-1;
            else if(nums[mid]<target)
                low = mid+1;
            else
                return mid;
        }
        return -1;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值