33. 搜索旋转排序数组

这篇博客探讨了两种不同的二分查找优化策略:不完全二分搜索和完全二分搜索。在给定有序数组中寻找目标值时,这两种方法都能提高搜索效率。不完全二分搜索通过比较目标值与中间元素的关系,调整搜索范围。完全二分搜索则根据数组的最左和最右元素与中间元素的关系来决定搜索方向。文章提供了具体的C++代码实现,展示了如何在实际问题中应用这两种优化策略。
摘要由CSDN通过智能技术生成

要求:找target
思路:二分
不完全二分,以rightleft判断

class Solution {
public:
    int search(vector<int>& nums, int target) {
        int n=nums.size();
        int left=0,right=n-1;
        while(left<=right){
            int mid=left+(right-left>>1);
            if(nums[mid]==target)return mid;
            else if(nums[mid]>target){
                if(nums[left]<target)right=mid-1;
                else if(nums[left]>target)++left;//在右边,但mid大于不能跳过
                else return left;
            }
            else if(nums[mid]<target){
                if(nums[right]<target)--right;//在左边,但mid小于不能跳过
                else if(nums[right]>target)left=mid+1;
                else return right;
            }
        }
        return -1;
    }
};

完全二分,以0和n-1判断

class Solution {
public:
    int search(vector<int>& nums, int target) {
        int n=nums.size();
        int left=0,right=n-1;
        while(left<=right){
            int mid=left+(right-left>>1);
            if(nums[mid]==target)return mid;
            if (nums[0] <= nums[mid]) {//mid在左边
                if (nums[0] <= target && target < nums[mid]) {//target也在左边,[0,mid-1]
                    right = mid - 1;
                } else {
                    left = mid + 1;
                }
            } else {//mid在右边
                if (nums[mid] < target && target <= nums[n - 1]) {//target也在右边,[mid+1,end]
                    left = mid + 1;
                } else {
                    right = mid - 1;
                }
            }
        }
        return -1;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值