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;
}
};