数组&二分查找-leetcode#33-搜索旋转排序数组

本文介绍了一种在旋转数组中实现二分查找的算法,详细解释了如何在O(log n)的时间复杂度下找到目标值。通过寻找旋转点,算法区分了数组的有序部分,从而在正确区间内进行高效搜索。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

class Solution {
public:
    int search(vector<int>& nums, int target) {
         if(nums.size()<=0) return -1;
         int index=0;
         while(index<nums.size()-1){
             if(nums[index+1]<nums[index]) break;
             index++;
         }
         if(index<nums.size()-1){
            if(nums[index]>target){
                if(nums[0]>target) return binary_search(nums,target,index+1,nums.size()-1);
                else return binary_search(nums,target,0,index-1);
            }else if(nums[index]==target) return index;
             else return -1;
         }else return binary_search(nums,target,0,nums.size()-1);        
    }
    int binary_search(vector<int>& nums, int target,int begin,int end){
        if(begin>end) return -1;
        else if(begin==end && nums[begin]==target) return begin;
        else{
            int mid = (begin+end)/2;
            if(nums[mid]<target) return binary_search(nums,target,mid+1,end);
            else if(nums[mid]==target) return mid;//出错(2)忘记了
            else 
                return binary_search(nums,target,begin,mid-1);
        }
    }
};

乍一看题,要求复杂度logn,不敢动了,查找旋转位置,其实不用耗费O(n)的时间复杂度,所以先寻找旋转位置,如果没找到,说明就是有序的数组,直接调用二分查找就完了,如果找到,进行比较,如果当前索引的数字比目标大,那么在前面和后面都有可能,所以先跟第0个元素比,如果第0个元素比target大,那么就在后半部分有序的找,如果等于,那么直接返回index,如果小于,那么说明不存在,返回-1;

(1)出错位置,二分查找的时候,少了一个等于判断。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值