一. 这题用二分法, 时间复杂度为O(log(n)).
1. 这种题目,先定好边界, 再考虑target的位置.
class Solution {
public:
int search(vector<int>& nums, int target) {
//边界条件
int numlen = nums.size();
if (numlen == 0)
return -1;
if (numlen == 1)
return nums[0] == target ? 0 : -1;
int l = 0, r = nums.size() - 1;
while (l <= r) {
int mid = l + (r - l) / 2;
//先处理简单情况, 如果等于target, 直接返回mid.
if (nums[mid] == target) return mid;
//注意到原数组为有限制的有序数组(除了在某个点会突然下降外均为升序数组)
if (nums[mid] < nums[r]) {
//因为此时mid不会为target, target在mid和r之间只有一种情况.
//因为在升序部分中,是单调的,而前面的部分不是单调的.
if (nums[mid] < target && nums[r] >= target) l = mid + 1;
else r = mid - 1;
}
else {
if (nums[mid] > target && nums[l] <= target) r = mid - 1;
else l = mid + 1;
}
}
return -1;
}
};