【LeetCode笔记】33. 搜索螺旋排序数组(Java、二分)

题目描述

  • 有序数组中搜索值,显然用二分
  • 旋转带来的影响并不大,只要多加几个判断,改改范围就行。
    在这里插入图片描述

思路 & 代码

  • 首先找出两部分升序子数组的分割点k
  • 然后再判断需要在哪个子数组进行二分,并进行二分即可。
  • 注意二分时候一定要舍去已判断无效值(也就是half)

更新。。之前的方法实际上不满足O(logn),分割点查找应该也使用二分查找。

class Solution {
    public int search(int[] nums, int target) {
       // 思路:一次分割点查找O(logn)。两次二分查找O(logn)
       int k = -1, low = 0, top = nums.length - 1;
       while(low <= top){
           k = (low + top) / 2;
           // 找到的情况:注意长度为1时,需要进行k + 1 == nums.length判断
           if(k + 1 == nums.length || nums[k] > nums[k + 1]){
               break;
           }
           if(nums[k] < nums[0]){
               top = k - 1;
           }
           else{
               low = k + 1;
           }  
       }
       // 判断选择在哪个部分进行二分
       if(target > nums[nums.length-1] || k == nums.length-1){
           return binary(nums,0,k,target);
       }
       else{
           return binary(nums,k+1,nums.length-1,target);
       }
    }

    public int binary(int[] nums,int left,int right,int target){
        // l = 0,r = -1的情况也要考虑
        if(left >= right){
            if(target == nums[left]){
                return left;
            }
            return -1;
        }
        int half = (left+right)/2;
        // 相等判断
        if(target == nums[half]){
            return half;
        }
        // 缩短范围,+-1去掉已判断的half
        else if(target > nums[half]){
            return binary(nums,half+1,right,target);
        }
        else{
            return binary(nums,left,half-1,target);
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值