diff --git a/33_search_in_rotated_sorted_array/main.cpp b/33_search_in_rotated_sorted_array/main.cpp new file mode 100644 index 0000000..1124850 --- /dev/null +++ b/33_search_in_rotated_sorted_array/main.cpp @@ -0,0 +1,55 @@ +#include +using namespace std; + +class Solution { + public: + int recursive(vector& nums, int target, int left, int right) { + int mid = (right + left) / 2; + + if (target == nums[mid]) { + return mid; + } + + if (left >= right) { + return -1; + } + + if (left + 1 == right) { + if (target == nums[left]) return left; + if (target == nums[right]) return right; + } + + // the left part is sorted && target is in the left part + if (nums[left] <= target && target <= nums[mid]) { + if (binary_search(nums.begin() + left, nums.begin() + mid + 1, target)) { + return lower_bound(nums.begin() + left, nums.begin() + mid + 1, target) - nums.begin(); + } + return -1; + } + + // the right part is sorted && target is in the right part + if (nums[mid] <= target && target <= nums[right]) { + if (binary_search(nums.begin() + mid, nums.begin() + right + 1, target)) { + return lower_bound(nums.begin() + mid, nums.begin() + right + 1, target) - nums.begin(); + } + return -1; + } + + // target is not in a sorted part + if (nums[left] < nums[mid]) { // the right part is not sorted + return recursive(nums, target, mid, right); + } else { // the left part is not sorted + return recursive(nums, target, left, mid); + } + } + + int search(vector& nums, int target) { + return recursive(nums, target, 0, nums.size() - 1); + } +}; + +int main() { + vector vec{3, 1}; + Solution().search(vec, 1); + return 0; +}