# 搜索旋转排序数组 II

<p>已知存在一个按非降序排列的整数数组 <code>nums</code> ，数组中的值不必互不相同。</p>
<p>在传递给函数之前，<code>nums</code> 在预先未知的某个下标 <code>k</code>（<code>0 <= k < nums.length</code>）上进行了 <strong>旋转
    </strong>，使数组变为 <code>[nums[k], nums[k+1], ..., nums[n-1], nums[0], nums[1], ..., nums[k-1]]</code>（下标 <strong>从 0
        开始</strong> 计数）。例如， <code>[0,1,2,4,4,4,5,6,6,7]</code> 在下标 <code>5</code> 处经旋转后可能变为
    <code>[4,5,6,6,7,0,1,2,4,4]</code> 。
</p>
<p>给你 <strong>旋转后</strong> 的数组 <code>nums</code> 和一个整数 <code>target</code> ，请你编写一个函数来判断给定的目标值是否存在于数组中。如果
    <code>nums</code> 中存在这个目标值 <code>target</code> ，则返回 <code>true</code> ，否则返回 <code>false</code> 。
</p>
<p> </p>
<p><strong>示例 1：</strong></p>
<pre><strong>输入：</strong>nums = [2,5,6,0,0,1,2], target = 0<strong><br />输出：</strong>true</pre>
<p><strong>示例 2：</strong></p>
<pre><strong>输入：</strong>nums = [2,5,6,0,0,1,2], target = 3<strong><br />输出：</strong>false</pre>
<p> </p>
<p><strong>提示：</strong></p>
<ul>
    <li><code>1 <= nums.length <= 5000</code></li>
    <li><code>-10<sup>4</sup> <= nums[i] <= 10<sup>4</sup></code></li>
    <li>题目数据保证 <code>nums</code> 在预先未知的某个下标上进行了旋转</li>
    <li><code>-10<sup>4</sup> <= target <= 10<sup>4</sup></code></li>
</ul>
<p> </p>
<p><strong>进阶：</strong></p>
<ul>
    <li>这是 <a
            href="https://leetcode-cn.com/problems/search-in-rotated-sorted-array/description/">搜索旋转排序数组</a> 的延伸题目，本题中的 <code>nums</code> 
        可能包含重复元素。</li>
    <li>这会影响到程序的时间复杂度吗？会有怎样的影响，为什么？</li>
</ul>

以下程序实现了这一功能，请你填补空白处内容：

```cpp
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
static bool search(int *nums, int numsSize, int target)
{
	int lo = 0;
	int hi = numsSize - 1;
	while (lo <= hi)
	{
		int mid = lo + (hi - lo) / 2;
		if (nums[mid] == target)
		{
			return true;
		}
		if (nums[lo] == nums[mid] && nums[mid] == nums[hi])
		{
			lo++;
			hi--;
		}
		else if (nums[lo] <= nums[mid])
		{
			___________________;
		}
		else
		{
			if (nums[mid] < target && target <= nums[hi])
			{
				lo = mid + 1;
			}
			else
			{
				hi = mid - 1;
			}
		}
	}
	return false;
}
int main(int argc, char **argv)
{
	int i;
	int target = atoi(argv[1]);
	int size = argc - 2;
	int *nums = malloc(size * sizeof(int));
	for (i = 0; i < argc - 2; i++)
	{
		nums[i] = atoi(argv[i + 2]);
	}
	printf("%d\n", search(nums, size, target));
	return 0;
}
```

## template

```cpp
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
static bool search(int *nums, int numsSize, int target)
{
	int lo = 0;
	int hi = numsSize - 1;
	while (lo <= hi)
	{
		int mid = lo + (hi - lo) / 2;
		if (nums[mid] == target)
		{
			return true;
		}
		if (nums[lo] == nums[mid] && nums[mid] == nums[hi])
		{
			lo++;
			hi--;
		}
		else if (nums[lo] <= nums[mid])
		{
			if (nums[lo] <= target && target < nums[mid])
			{
				hi = mid - 1;
			}
			else
			{
				lo = mid + 1;
			}
		}
		else
		{
			if (nums[mid] < target && target <= nums[hi])
			{
				lo = mid + 1;
			}
			else
			{
				hi = mid - 1;
			}
		}
	}
	return false;
}
int main(int argc, char **argv)
{
	int i;
	int target = atoi(argv[1]);
	int size = argc - 2;
	int *nums = malloc(size * sizeof(int));
	for (i = 0; i < argc - 2; i++)
	{
		nums[i] = atoi(argv[i + 2]);
	}
	printf("%d\n", search(nums, size, target));
	return 0;
}
```

## 答案

```cpp
if (nums[lo] <= target && target < nums[mid])
{
	hi = mid - 1;
}
else
{
	lo = mid + 1;
}
```

## 选项

### A

```cpp
if (nums[lo] <= target && target < nums[mid])
{
	hi = mid + 1;
}
else
{
	lo = mid - 1;
}
```

### B

```cpp
if (nums[lo] <= target && target < nums[mid])
{
	lo = mid + 1;
}
else
{
	hi = mid - 1;
}
```

### C

```cpp
if (nums[lo] <= target && target < nums[mid])
{
	lo = mid - 1;
}
else
{
	hi = mid + 1;
}
```