难度:中等。
标签:数组,二分查找。
要想清楚各种情况,保持思路清晰。
别绕进去了,错了三次。
正确解法:
class Solution {
public:
bool search(vector<int>& nums, int target) {
int n = nums.size();
int left = 0, right = n - 1, ans = n;
while(left <= right){
int mid = (left + right) / 2;
if(nums[mid] == target || left == right){
ans = mid;
break;
}
if(nums[right] == target){
ans = right;
break;
}
if(nums[left] == target){
ans = left;
break;
}
if(nums[left] == nums[right]){
left++;
right--;
continue;
}
if(nums[right] > nums[mid]){
if(nums[mid] > target || nums[right] < target){
right = mid - 1;
ans = mid;
}
else if(nums[mid] < target && nums[right] > target){
left = mid + 1;
}
}
else if(nums[right] < nums[mid]){
if(target < nums[right] || nums[mid] < target){
left = mid + 1;
}
else if(nums[right] < target && nums[mid] > target){
right = mid - 1;
ans = mid;
}
}
else{
right = mid - 1;
}
}
if(ans >= 0 && ans < n && nums[ans] == target)return true;
return false;
}
};
结果:
2021.04.07 第二次做,调了一会,一次通过
class Solution {
public:
bool search(vector<int>& nums, int target) {
int n = nums.size();
int left = 0, right = n - 1;
while(left <= right){
int mid = (left + right) / 2;
if(nums[mid] == target)return true;
if(nums[mid] == nums[right]){
right--;
}
else if(nums[mid] < nums[right]){
if(nums[mid] > target || target > nums[right]){
right = mid - 1;
}
else{
left = mid + 1;
}
}
else if(nums[mid] > nums[right]){
if(nums[mid] < target || target <= nums[right]){
left = mid + 1;
}
else{
right = mid - 1;
}
}
}
return false;
}
};
结果: