假设某个按照升序排序的数组在某个元素前旋转(例如:0 1 2 4 5 6 7 =>4 5 6 7 0 1 2)。给定一个目标值,判断该数组是否包含这个元素,如果包含返回对应TRUE,否则返回FALSE。可以存在重复元素
解题思路:
此题与第33题基本相似,但可以存在重复元素。所以第一思路就是按照33题的思路进行二分查找。由于存在重复元素,可能导致无法判断哪一侧是有序数据,需要在判断之间去除重复元素:
while (nums[m] == nums[mid] && nums[n] == nums[mid])
{
m++;
n--;
}
利用循环找到两边第一次出现不与中间元素重复 的位置,然后进行判断。
实现:
bool search(vector<int>& nums, int target) {
int n = nums.size() - 1;
int m = 0;
int mid = 0;
while (m <= n)
{
mid = (m + n) / 2;
if (nums[mid] == target)
{
return true;
}
while (nums[m] == nums[mid] && nums[n] == nums[mid])
{
m ++;
n --;
}
if (nums[m] <= nums[mid])
{
if (nums[m] <= target && nums[mid] > target)
{
n = mid - 1;
}
else
{
m = mid + 1;
}
}
else
{
if (nums[mid] < target && nums[n] >= target)
{
m = mid + 1;
}
else
{
n = mid - 1;
}
}
}
return false;
}