题目如下:
解题思路:
参考leetcode-33题,这道题实际上时间复杂度要求为O(lgn),因此需要用二分法,但不同之处在于有重复元素需要处理(直接二分会对诸如:[3、1、1],目标值1——得不到正确结果)。
代码如下:
class Solution {
public:
bool search(vector<int>& nums, int target) {
int l = 0;
int r = nums.size() - 1;
int mid;
while(l <= r) {
mid = (l + r) / 2;
if(nums[mid] == target)
return true;
//去除重复元素
if(nums[mid] == nums[l]){
l++;
continue;
}
else if(nums[mid] == nums[r]) {
r--;
continue;
}
//开始二分查找
else if(nums[mid] < nums[r]) {//右边有序
if(nums[mid] < target && target <= nums[r]) //在右侧单调递增区间比较
l = mid + 1;
else
r = mid - 1;
}
else {//左边有序
if(nums[l] <= target && target < nums[mid]) //在左侧单调递增区间比较
r = mid - 1;
else
l = mid + 1;
}
}
return false;
}
};