题目描述
假设按照升序排序的数组在预先未知的某个点上进行了旋转。
( 例如,数组 [0,0,1,2,2,5,6] 可能变为 [2,5,6,0,0,1,2] )。
编写一个函数来判断给定的目标值是否存在于数组中。若存在返回 true,否则返回 false。
示例 1:
输入: nums = [2,5,6,0,0,1,2], target = 0
输出: true
示例 2:
输入: nums = [2,5,6,0,0,1,2], target = 3
输出: false
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/search-in-rotated-sorted-array-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解法
class Solution {
bool findValue(vector<int>& line,int l,int r,int tar){
while(l<=r){
int mid=(l+r)/2;
if(line[mid]==tar){
return true;
}
else if(line[mid]>tar){
r=mid-1;
}
else if(line[mid]<tar){
l=mid+1;
}
}
return false;
}
public:
bool search(vector<int>& nums, int target) {
int len = nums.size();
int l = 0,r=len-1;
int xp = 0;
if(len==0) {
return false;
}
//若数组中数值都相等,注意终止条件
while(nums[l]==nums[r]&&l!=r){
l++;
}
if(l==r){
return nums[l]==target?true:false;
}
//如果是正序序列,直接二分查找
if(nums[l]<nums[r]){
return findValue(nums,l,r,target);
}
/*寻找旋转点,xp*/
while(l<=r){
/*跳过左右两端的相同值*/
while(l<len-1&&nums[l]==nums[l+1]){
l++;
continue;
}
while(r>0&&nums[r]==nums[r-1]){
r--;
continue;
}
int mid = (l+r)/2;
xp=mid;
/*跳过xp的相同值*/
while(xp<len-1&&nums[xp]==nums[xp+1]){
xp++;
continue;
}
if(nums[xp]>nums[xp+1]){
break;
}//找到逆序点
if(nums[xp]>nums[0]){
l=xp+1;
}
else if(nums[xp]<nums[0]){
r=xp-1;
}
}
if(target>=nums[0]){
return findValue(nums,0,xp,target);
}
else{
return findValue(nums,xp+1,len-1,target);
}
}
};