33 Search in Rotated Sorted Array
// no need to exit condition because we are guarentee to
// linearly converge to a pivot point (check is made that it exists)
int find_pivot(vector<int> &nums, int low, int high) {
int mid = low + ((high - low) / 2);
if (nums.at(mid) > nums.at(mid + 1)) {
return mid + 1;
}
else if (nums.at(low) <= nums.at(mid)) return find_pivot(nums, mid + 1, high);
else return find_pivot(nums, low, mid - 1);
}
int binary_search(vector<int> &nums, int low, int high, int target) {
if (high < low) return -1;
int mid = low + ((high - low) / 2);
if (nums.at(mid) == target) return mid;
else if (nums.at(mid) > target) return binary_search(nums, low, mid - 1, target);
else return binary_search(nums, mid + 1, high, target);
}
int search(vector<int>& nums, int target) {
if (nums.empty()) return -1;
int start = 0;
int end = nums.size() - 1;
// not rotated
if (nums.front() <= nums.back())
return binary_search(nums, start, end, target);
// find pivot point
int pivot_i = find_pivot(nums, start, end);
if (nums.at(pivot_i) == target)
return pivot_i;
// search right [pivot, end]
else if (target >= nums.at(pivot_i) && target <= nums.back())
return binary_search(nums, pivot_i + 1, end, target);
// search left [start, pivot]
else return binary_search(nums, start, pivot_i - 1, target);
}Last updated