day 41: 33-search-in-rotated-sorted-array

This commit is contained in:
Kaushik Narayan R 2023-11-22 12:48:10 -07:00
parent 5f1e2efa9e
commit 832df6f66e
3 changed files with 110 additions and 0 deletions

View File

@ -0,0 +1,11 @@
#include "soln.hpp"
int main()
{
vector<int> 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;
}

View File

@ -0,0 +1,91 @@
#include "soln.hpp"
int Solution::search(vector<int> &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<int> &nums, int target, int answer)
{
return search(nums, target) == answer;
}

View File

@ -0,0 +1,8 @@
#include <bits/stdc++.h>
using namespace std;
class Solution
{
public:
int search(vector<int> &nums, int target);
bool test(vector<int> &nums, int target, int answer);
};