力扣(LeetCode)81. 搜索旋转排序数组 II(C++)

线性探测+二分查找

本题和 力扣(LeetCode)33. 搜索旋转排序数组(C++) 的唯一区别是有重复元素,思考我们之前的二分条件,是根据 n u m s [ 0 ] nums[0] nums[0] n u m s [ m i d ] nums[mid] nums[mid] 判断 m i d mid mid 哪一端有序,但是现在可能出现 n u m s [ 0 ] = n u m s [ m i d ] = n u m s [ r ] nums[0]=nums[mid] =nums[r] nums[0]=nums[mid]=nums[r] ,再按照 n u m s [ m i d ] nums[mid] nums[mid] n u m s [ 0 ] nums[0] nums[0] 判断有序,已经不成立了。考虑去除 n u m s nums nums 末尾等于 n u m s [ 0 ] nums[0] nums[0] 的数,避免特例,这样就可以按照 33 33 33 题那样二分了。

class Solution {
public:
    bool search(vector<int>& nums, int target) {
        int r = nums.size()-1;
        while(r>=0&&nums[0]==nums[r]) r--;
        if(r<0) return nums[0]==target;
        int l = 0;
        while(l<=r){
            int mid = l+((r-l)>>1);
            if(nums[0]<=nums[mid]){//左端有序
                if(target>=nums[0]&&nums[mid]>=target) r = mid -1;
                else l = mid + 1;
            }else{
                if(target<nums[0]&&nums[mid]<target) l = mid + 1;
                else r = mid - 1;
            }
        }
        if(nums.size()==l) return false;
        return nums[l]==target;
    }
};

时间复杂度 O ( n ) O(n) O(n) ,线性探测的最坏时间复杂度 O ( n ) O(n) O(n)

空间复杂度 O ( 1 ) O(1) O(1) ,只用到常量级空间 。

致语

理解思路很重要。
欢迎读者在评论区留言,答主看到就会回复的。

AC

AC

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

清墨韵染

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值