class Solution { public:
int search(vector<int> &nums, int target) { return searchB(nums, target, 0, nums.size() - 1); } int searchB(vector<int> &nums, int target, int start, int end) { if (start > end) return -1; int mid = start + (end - start) / 2; if (nums[mid] >= nums[start]) { if (target >= nums[start] && target <= nums[mid]) { return bsearchWithoutRecursion(nums, start, mid, target); } else { return searchB(nums, target, mid + 1, end); } } else if (nums[mid] < nums[start]) { if (target >= nums[mid] && target <= nums[end]) { return bsearchWithoutRecursion(nums, mid, end, target); } else { return searchB(nums, target, start, mid - 1); } } return nums[mid] == target ? mid : -1; } int bsearchWithoutRecursion(vector<int> &nums, int low, int high, int target) { while (low <= high) { int mid = low + (high - low) / 2; if (nums[mid] > target) high = mid - 1; else if (nums[mid] < target) low = mid + 1; else return mid; } return -1; } };
|