解题方案:
- 本题给定条件为升序,所以可以采用二分查找的方式进行查找,这里要注意一下,无论怎样旋转,总有一半的数组是有顺序的,所以我们选用有顺序的一半数组进行二分查找
class Solution {
public:
int search(vector<int>& nums, int target) {
int n = (int)nums.size();
if (!n) {
return -1;
}
if (n == 1) {
return nums[0] == target ? 0 : -1;
}
int l = 0, r = n - 1;
while (l <= r) {
int mid = (l + r) / 2;
if (nums[mid] == target) return mid;
//经过计算中位数左右总有一面是有序的,所以选择有序的一面进行操作,这样就可以进行二分查找了
if (nums[0] <= nums[mid]) {
if (nums[0] <= target && target < nums[mid]) {
r = mid - 1;
} else {
l = mid + 1;
}
} else {
if (nums[mid] < target && target <= nums[n - 1]) {
l = mid + 1;
} else {
r = mid - 1;
}
}
}
return -1;
}
};