Follow up for "Search in Rotated Sorted Array":
What if duplicates are allowed?
Would this affect the run-time complexity? How and why?
Write a function to determine if a given target is in the array
题意:基于33题的题意,如果数组中存在重复该如何处理。思路:无重复时:
二分查找的思路,从中间截取后一定会有一部分是有序的。
左侧若有序,则右侧可能有序;左侧若无序,则右侧一定有序。
判断左侧是否有序的方法是比较if (nums[left] <= nums[mid])。
若左侧有序,此时target>nums[mid]则递归查找右侧,
若target<nums[mid], 则比较target 与nums[left]的值,从而决定在哪里找target。
有重复时:
首先判断mid处是否相等,
找到左侧第一个不是mid的数,若没找到,则说明左侧重复,直接从右半部分查找即可;
若找到,判断左侧是否有序,并根据target是否在相应区间,搜索其对应部分。
class Solution {
public:
bool search(vector<int>& nums, int target) {
return binarySearch(nums, target, 0, nums.size() - 1);
}
bool binarySearch(vector<int>& nums, int target, int left, int right){
while (left <= right){
int mid = (left + right) / 2;
if (target == nums[mid]){
return true;
}
else {
//judge the order
while (left < mid && nums[left] == nums[mid]){
left++;
}
if (left == mid){//left part all equal
return binarySearch(nums, target, mid + 1, right);
}
else{
if (nums[left] < nums[mid]){//left part oedered
if (target < nums[mid] && target >= nums[left]){
return binarySearch(nums, target, left, mid - 1);
}
else{
return binarySearch(nums, target, mid + 1, right);
}
}
else{//right part ordered
if (target > nums[mid] && target <= nums[right]){
return binarySearch(nums, target, mid + 1, right);
}
else{
return binarySearch(nums, target, left, mid - 1);
}
}
}
}
}
return false;
}
};