【leetcode】No.81 Search in Rotated Sorted Array II

Follow up for "Search in Rotated Sorted Array":
What if duplicates are allowed?

Would this affect the run-time complexity? How and why?

Write a function to determine if a given target is in the array.

从题干中可以看出,返回值是布尔类型。正如同 No.154 Find Minimum in Rotated Sorted Array II,允许出现重复值,对二分查找是一个致命的影响。当出现无法判断向左还是向右走的时候,我们就只能暂时放弃二分法,采用笨笨的 把整个区间一个数一个数地逐渐缩小。其余做法和No.33 Search in Rotated Sorted Array是一样的。

class Solution {
public:
    int search(vector<int>& nums, int target) {
        //因为这还是一个局部有序的数组,用变形的二分查找
        int iBegin = 0, iEnd = nums.size() - 1;
        int iMid = 0;
        
        while(iBegin <= iEnd)
        {
            iMid = (iBegin + iEnd) >> 1;
            //若找到目标值,立即结束战斗
            if(nums[iMid] == target)
                return true;
            
            //如果运行到这里,就一定有nums[iMid] != target
            if(nums[iMid] == nums[iEnd])
            {
                iEnd--;
            }
            //若中间值大于结尾,表明中值点在第一段
            else if(nums[iMid] > nums[iEnd])
            {
                //若目标在区间[iBegin,iMid]上
                if(nums[iMid] > target && nums[iBegin] <= target)
                    iEnd = iMid - 1;
                else
                    iBegin = iMid + 1;
            }
            else //中值点在第二段
            {
                //若目标在区间[iMid,iEnd]上
                if(nums[iMid] < target && nums[iEnd] >= target)
                    iBegin = iMid + 1;
                else
                    iEnd = iMid - 1;
            }
        }
        
        return false;
    }
};


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值