LeetCode第33题,搜索旋转排序数组,Java,二分查找

问题:

思路:

        用二分查找,虽然是旋转数组,但是照样可以用,只不过我的写法可能比较麻烦,分的讨论情况比较多。

例如 产生的left、mid、right的关系只可能有两种

1、mid>=left>right

2、mid<=right<left

而针对每一种情况,target又只可能存在3个数产生的4个空隙中,例如对于第一种情况

(0)target 首先如果等于 这三个数的任意一个,则可以返回

(1)target 如果在left 和 right之间,一定不存在,返回-1

(2)target 在left 和 mid 之间,也就是做半端,有半段舍弃

(3、4)target 比mid还要大,或者比right还要小,这两种情况,都属于右半段,所以合并讨论,舍弃左边的

 同理对于情况2,也有这样的空隙可以讨论。

可以看表格更加直观地理解“空隙”,情况2 是我随便写的,知识方便理解而已

4567012
1、leftmidright

2、

leftmidright

代码:

class Solution {
    public int search(int[] nums, int target) {
        int left = 0;
        int right = nums.length-1;
        while(left <= right){
            int mid = left + (right-left)/2;

            //mid>left>right
            if(nums[mid] >= nums[left]&&  nums[mid] >nums[right]){
                if(target < nums[left]&&target>nums[right]){
                    return -1;
                }else if(target > nums[left]&&target<nums[mid]){
                    right = mid - 1;
                }else if(target < nums[right]){
                    right = right-1;
                }else if(target > nums[mid]){
                    left = mid + 1;
                }
                else if(target ==nums[mid]){
                    return mid;
                }else if(target ==nums[left]) {
                	return left;
                }else if(target ==nums[right]) {
                	return right;
                }
            }
            //mid<right<left
            else if (nums[mid] < nums[left]&&  nums[mid] <= nums[right]){

                if(target < nums[left]&&target>nums[right]){
                    return -1;
                }else if(target > nums[mid]&&target<nums[right]){
                    left = mid + 1;
                }else if(target < nums[mid] || target > nums[left]){
                    right = mid-1;
                    left = left+1;
                }else if(target ==nums[mid]){
                    return mid;
                }else if(target ==nums[left]) {
                	return left;
                }else if(target ==nums[right]) {
                	return right;
                }

            }else if(nums[mid] >= nums[left]&&  nums[mid] <= nums[right]){
                if(target == nums[mid]){
                    return mid;
                }else if(target >nums[mid]){
                    left = mid+1;
                }else if(target<nums[mid]){
                    right = mid-1;
                }
            }
        }
        return -1;
    }
}

        

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值