81. Search in Rotated Sorted Array II
题目描述:
Follow up for “Search in Rotated Sorted Array”:
What if duplicates are allowed?
Would this affect the run-time complexity? How and why?
Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand.
(i.e., 0 1 2 4 5 6 7 might become 4 5 6 7 0 1 2).
Write a function to determine if a given target is in the array.
The array may contain duplicates.
题解:
二分查找
有重复元素的旋转排序数组,判断target是否在数组内。
当nums[first] <= nums[mid]时,不能确定前半部分是否递增,例如:1231111
分别考虑三种情况:
1. nums[first] < nums[mid]前半部分递增
2. nums[first] > nums[mid]后半部分递增
3. nums[first] == nums[mid]有重复情况,直接舍去first元素,向后看一个数
solution1
class Solution {
public:
bool search(const vector<int>& nums, int target) {
int first = 0;
int last = nums.size();
while (first != last) {
int mid = (first + last) / 2;
if (nums[mid] == target) {
return true;
}
if (nums[first] < nums[mid]) { // 前半部分递增
if (nums[first] <= target && target < nums[mid]) { // target在递增部分(可直接确定范围)
last = mid;
} else {
first = mid + 1;
}
} else if (nums[first] > nums[mid]) { // 后半部分递增
if (nums[mid] < target && target <= nums[last-1]) {
first = mid + 1;
} else {
last = mid;
}
} else { // 有重复,由于只要判断存在与否,可直接舍去first
first++;
}
}
return false;
}