描述
跟进“搜索旋转排序数组”,假如有重复元素又将如何?
是否会影响运行时间复杂度?
如何影响?
为何会影响?
写出一个函数判断给定的目标值是否出现在数组中。
样例
跟进“搜索旋转排序数组”,假如有重复元素又将如何?
是否会影响运行时间复杂度?
如何影响?
为何会影响?
写出一个函数判断给定的目标值是否出现在数组中。
样例
给出[3,4,4,5,7,0,1,2]和target=4,返回 true
分析
该题目只需要判断目标值在数组中是否存在,所以只需要对其排序,用二分法查找即可。对于排序,找到突然递减的那个位置,然后对前段和后段翻转,此时数组是从大到小排序的。最后用二分法查找是否存在,这里需要注意数组的边界。
程序
class Solution {
public:
/**
* @param A: an integer ratated sorted array and duplicates are allowed
* @param target: An integer
* @return: a boolean
*/
void reverse_array(vector<int> &A, int left, int right){
while (left < right){
swap(A[left++], A[right--]);
}
}
bool search(vector<int> &A, int target) {
// write your code here
if (A.empty())
return false;
int i;
for (i = 1; i < A.size(); i++)
if (A[i] < A[i - 1])
break;
reverse_array(A, 0, i - 1);
reverse_array(A, i, A.size() - 1);
int right = A.size() - 1;
int left = 0;
while (left <= right)
{
int mid = (left + right) >> 1;
if (A[mid] < target)
right = mid - 1;
else if (A[mid] > target)
left = mid + 1;
else
return true;
}
return false;
}
};