【题目描述】
假设按照升序排序的数组在预先未知的某个点上进行了旋转。
( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。
搜索一个给定的目标值,如果数组中存在这个目标值,则返回它的索引,否则返回 -1 。
你可以假设数组中不存在重复的元素。
你的算法时间复杂度必须是 O(log n) 级别。

【思路】
1. 整体与二分查找相似
2. 左边有序:target在左边(判断条件 (nums[left] <= target)&&(target <= nums[mid]))or target在右边(判断条件 上一条的else)
右边有序:target在右边(判断条件)
【问题】
1. 二分查找时注意边界值,这次用的是闭区间
2. C++ 不可三个比较 要用&&连接
3. 第一次写的时候判断左边有序还是右边有序的条件错误,
```
if (nums[left] < nums[mid])
// 错误的用例 {3,1}
```
此时left = mid 会导致进入不了任何一个if条件
所以要有等号
【代码】
```
class Solution {
public:
int search(vector<int>& nums, int target) {
if(nums.size()==0) return -1;
int res = helpSearch(nums, target, 0, nums.size() - 1);
return res;
}
int helpSearch(vector<int>& nums, int target, int left, int right) {
int mid = (left + right) / 2;
if (nums[mid] == target) return mid;
if (left == right) {
return -1;
}
else {
if (nums[left] <= nums[mid]) {
//左边有序
if ((nums[left] <= target)&&(target <= nums[mid])) {
//target在左边
return helpSearch(nums, target, left, mid);
}
else {
//target不在左边
return helpSearch(nums, target, mid + 1, right);
}
}
if (nums[mid] <= nums[right]) {
//右边有序
if ((nums[mid] <= target)&&(target <= nums[right])) {
//target在右边
return helpSearch(nums, target, mid + 1, right);
}
else {
//target不在右边
return helpSearch(nums, target, left, mid);
}
}
}
return -1;
}
};
```
【result】

网友评论