1、二分查找
由于题目要求O(logn)的时间复杂度进行查找数字,因此应当使用二分查找法。但考虑到数组中有一个未知的旋转下标,因此我们在使用二分查找时需要针对不同的情况进行讨论。
1、当nums[low] <= nums[mid]时,此时旋转下标一定落在mid之后。若此时我们需要查找的target落在nums[low]和nums[mid]的范围中间,则说明我们需要进行查找的是前半段数组,可以不用考虑旋转下标的位置,因此将mid作为上界。
2、当nums[low] > nums[mid]时,此时旋转下标一定落在mid之前,因此需要针对target与两端的值进行讨论。若此时target >= nums[low],说明此时target应落在low到旋转下标之间的位置上,需要将mid作为上界;若此时target <= nums[mid],说明此时target应落在旋转下标到mid之间的位置上,需要将mid作为上界。
3、除了以上两种情况以外,在其他情况下,target都落在mid后面的数组上,因此将mid作为下界即可。
class Solution {
public:
int search(vector<int> &nums, int target) {
int low = 0, high = nums.size() - 1;
int mid;
while (low < high) {
mid = (low + high) / 2;
if (nums[low] <= nums[mid] && target <= nums[mid] && target >= nums[low]) {
high = mid;
} else if (nums[low] > nums[mid] && (target >= nums[low] || target <= nums[mid])) {
high = mid;
} else {
low = mid + 1;
}
}
return (nums[low] == target) ? low : -1;
}
};