原题网址:https://www.lintcode.com/problem/search-in-rotated-sorted-array-ii/description
描述
跟进“搜索旋转排序数组”,假如有重复元素又将如何?
是否会影响运行时间复杂度?
如何影响?
为何会影响?
写出一个函数判断给定的目标值是否出现在数组中。
您在真实的面试中是否遇到过这个题?
样例
给出[3,4,4,5,7,0,1,2]和target=4,返回 true
标签
二分法
排序数组
数组
思路:方法与搜索排序数组类似,只是多了一个重复判断,如果 left 处元素与 mid 处元素相同,left~mid 部分的元素一定是相同的,可以直接跳过这部分去判断 mid+1 ,即 left++;
元素重复会影响时间复杂度,因为重复是无法折半查找,而是以距离1步进,时间复杂度会变大。
AC代码:
class Solution { public: /** * @param A: an integer ratated sorted array and duplicates are allowed * @param target: An integer * @return: a boolean */ bool search(vector<int> &A, int target) { // write your code here if (A.empty()) { return false; } int size=A.size(); int left=0,right=size-1,mid; while(left<=right) { mid=(left+right)/2; if (A[mid]==target) { return true; } if (A[mid]>A[left]) { if (A[left]<=target&&target<A[mid]) { right=mid-1; } else { left=mid+1; } } else if (A[mid]<A[left]) if (target>A[mid]&&target<=A[right]) { left=mid+1; } else { right=mid-1; } } else//相等时顺序查找; { left++; } } return false; } };
Mark一个资源:
算法总结—二分搜索与旋转排序数组