描述
跟进“搜索旋转排序数组”,假如有重复元素又将如何?
是否会影响运行时间复杂度?
如何影响?
为何会影响?
写出一个函数判断给定的目标值是否出现在数组中。
样例
跟进“搜索旋转排序数组”,假如有重复元素又将如何?
是否会影响运行时间复杂度?
如何影响?
为何会影响?
写出一个函数判断给定的目标值是否出现在数组中。
样例
给出[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; } };