leetcode 33: Search in Rotated Sorted Array

本文介绍了改进的二分查找算法,通过优化查找过程,提高了效率。算法分为两部分:第一部分确定旋转点,第二部分进行常规二分查找。通过减少不必要的比较,实现了对有序数组的高效搜索。

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

class Solution {
public:
    int search(vector<int>& nums, int target) {
        int left=0,right=nums.size()-1,mid=(left+right)/2;
        while(mid!=left&&mid!=right&&(nums[mid]<nums[left]||nums[mid]>nums[right]))
        {
            if(nums[mid]<nums[left])
            {
                right=mid;
                mid=(left+right)/2;
            }
            else if(nums[mid]>nums[right])
            {
                left=mid;
                mid=(left+right)/2;
            }
        }//find out the position that was rotated by
        if(left==0&&right==nums.size()-1&&nums[left]<nums[right])//if no rotation is done or two numbers are rotated, (3,1) as an example
            return bisearch(left,right,nums,target);
        int res=bisearch(0,left,nums,target);
        return res==-1?bisearch(right,nums.size()-1,nums,target):res;
    }
    int bisearch(int left,int right,vector<int> nums,int target)
    {
        int mid=(left+right)/2;
        while(left!=right)
        {
            if(nums[mid]==target)
                return mid;
            if(target>nums[mid])
                left=mid+1;
            else if(target<nums[mid])
                right=mid;
            mid=(left+right)/2;
        }
        if(nums[mid]==target)
            return mid;
        return -1;
    }
};

Updated version, only need to do the binary search once.

class Solution {
public:
    int search(vector<int>& nums, int target) {
        int size=nums.size();
        int l=0,r=size-1,mid=(l+r)/2;
        while(l<r)
        {
            if(nums[mid]==target)
                return mid;
            if(nums[l]<=nums[mid])//left part is in order
            {
                if(target>=nums[l]&&target<nums[mid])//target is in the left part
                    r=mid;
                else
                    l=mid+1;
            }
            else//right part is in order
            {
                if(target>nums[mid]&&target<=nums[r])//target is in the right part
                    l=mid+1;
                else
                    r=mid;
            }
            mid=(l+r)/2;
        }
        return nums[mid]==target?mid:-1;//for vector that only contains one element
    }
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值