面试题 10.03. 搜索旋转数组

这个题上来就遍历一遍找到的话,明显配不上它中等的身份。所以一定有复杂度更低的算法。
这个题目就是二分,关键是怎么寻找目标位置。如果在left位置等于目标值,我们就直接返回这个位置,之所以这样是因为题目中有重复值,我们需要找最小位置的目标值。然后如果mid这个位置的值等于目标值,我们把right等于mid,让它再往前查找是否还有合适的满足目标的值。否则的话我们就看目标值是在前部半分还是在后半部分,如果前半部分是arr[mid]大于arr[0]的,那么说明一定有小于arr[mid]并大于arr[0]的数字,下一步就看target值在不在他俩中间,如果在的话,就去左半部分查找,不在的话,就去右半部分。如果前半部分是arr[mid]小于arr[0]的,那看target在不在后半部分,如果在就在后半部分查找,否则就去前半部分。如果出现mid和arr[0]位置值相同的话而且还不是我们寻找的目标位置,我们就left+1,把最前的位置去除掉。

class Solution {
    public int search(int[] arr, int target) {
    int len= arr.length;
    int left=0,right=len-1;
    while(left<=right)
    {
        int mid=(left+right)/2;
        if(arr[left]==target){
           return left;
        }
        if(arr[mid]==target)
        {
            right=mid;
        }
        else if(arr[mid]>arr[0])
        {
            if(arr[mid]>target&&target>=arr[0])
                right=mid-1;
            else
                left=mid+1;
        }
        else if(arr[mid]<arr[0])
        {
            if(arr[mid]<target&&target<=arr[len-1])
                left=mid+1;
            else
                right=mid-1;
        }
        else
            left+=1;
    }
    return -1;
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值