diff --git a/33-search-in-rotated-sorted-array/driver.cpp b/33-search-in-rotated-sorted-array/driver.cpp new file mode 100644 index 0000000..1c1e234 --- /dev/null +++ b/33-search-in-rotated-sorted-array/driver.cpp @@ -0,0 +1,11 @@ +#include "soln.hpp" + +int main() +{ + vector nums{4, 5, 6, 7, 0, 1, 2}; + int target = 0; + int answer = 4; + Solution soln; + cout << "Searched rotated sorted array correctly? " << soln.test(nums, target, answer) << endl; + return 0; +} \ No newline at end of file diff --git a/33-search-in-rotated-sorted-array/soln.cpp b/33-search-in-rotated-sorted-array/soln.cpp new file mode 100644 index 0000000..b382ac7 --- /dev/null +++ b/33-search-in-rotated-sorted-array/soln.cpp @@ -0,0 +1,91 @@ +#include "soln.hpp" + +int Solution::search(vector &nums, int target) +{ + if (nums.size() == 1) + { + return nums[0] == target ? 0 : -1; + } + else if (nums.size() == 2) + { + return nums[0] == target ? 0 : nums[1] == target ? 1 + : -1; + } + int low = 0, high = nums.size() - 1, mid, pivot = -1; + // check 0 rotation edge cases + // if so, perform binary search right here + if (nums[low] < nums[high]) + { + while (low < high) + { + mid = (low + high) / 2; + if (nums[mid] == target) + { + return mid; + } + else if (nums[mid] < target) + { + low = mid + 1; + } + else + { + high = mid - 1; + } + } + return nums[low] == target ? low : -1; + } + // find pivot + low = 0, high = nums.size() - 1; + while (low < high) + { + mid = (low + high) / 2; + if ( + (mid == 0 && nums[mid] > nums[mid + 1]) || + (mid != 0 && nums[mid] >= nums[mid - 1] && nums[mid] > nums[mid + 1])) + { + pivot = mid; + break; + } + if (nums[mid] < nums[low]) + { + high = mid; + } + else + { + low = mid + 1; + } + } + // find half it should be in + low = 0, high = nums.size() - 1; + if (target < nums[low]) + { + low = pivot + 1; + } + else + { + high = pivot; + } + // binary search that half + while (low < high) + { + mid = (low + high) / 2; + if (nums[mid] == target) + { + return mid; + } + else if (nums[mid] < target) + { + low = mid + 1; + } + else + { + high = mid - 1; + } + } + return nums[low] == target ? low : -1; +} + +bool Solution::test(vector &nums, int target, int answer) +{ + return search(nums, target) == answer; +} diff --git a/33-search-in-rotated-sorted-array/soln.hpp b/33-search-in-rotated-sorted-array/soln.hpp new file mode 100644 index 0000000..a81badc --- /dev/null +++ b/33-search-in-rotated-sorted-array/soln.hpp @@ -0,0 +1,8 @@ +#include +using namespace std; +class Solution +{ +public: + int search(vector &nums, int target); + bool test(vector &nums, int target, int answer); +}; \ No newline at end of file