我看到这道题的时候想到了用二分,可是不知道怎么用,后来看题解说是先用二分找到pivot,再二分一次,觉得很巧妙。而且做这道题的时候需要注意特殊情况:
- 根本没有旋转。
- nums为空
- nums中只有一个元素
在没有旋转时nums[pivot] > nums[pivot + 1]这个条件是无法找到pivot的,而且还会使程序执行错误,所以需要用
if (nums[left] < nums[right]) { //有可能根本没有旋转
pivot = right;
}
来判断出根本没有翻转的情况,来特殊处理。
最终的代码如下
class Solution {
private:
static int BinarySearch(int left, int right, int target, vector<int>& nums)
{
while (left <= right) {
int mid = (left + right) / 2;
if (nums[mid] == target) {
return mid;
}
if (nums[mid] > target) {
right = mid - 1;
} else {
left = mid + 1;
}
}
return -1;
}
public:
int search(vector<int>& nums, int target) {
int l = nums.size();
if (l == 0) return -1;
if (l == 1) return nums[0] == target ? 0 : -1;
if (nums[0] == target) {
return 0;
}
int result = -1;
int left = 0;
int right = l - 1;
int pivot = -1;
if (nums[left] < nums[right]) { //有可能根本没有旋转
pivot = right;
} else {
while (left <= right) {
pivot = (left + right) / 2;
if (nums[pivot] > nums[pivot + 1]) {
break;
}
if (nums[pivot] >= nums[0]) {
left = pivot + 1;
} else {
right = pivot - 1;
}
}
}
if (target > nums[0]) {
result = BinarySearch(0, pivot, target, nums);
} else {
result = BinarySearch(pivot + 1, l - 1, target, nums);
}
return result;
}
};