mirror of
https://github.com/20kaushik02/leetcode-gulag.git
synced 2025-12-06 06:24:07 +00:00
day 41: 33-search-in-rotated-sorted-array
This commit is contained in:
parent
5f1e2efa9e
commit
832df6f66e
11
33-search-in-rotated-sorted-array/driver.cpp
Normal file
11
33-search-in-rotated-sorted-array/driver.cpp
Normal 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;
|
||||
}
|
||||
91
33-search-in-rotated-sorted-array/soln.cpp
Normal file
91
33-search-in-rotated-sorted-array/soln.cpp
Normal 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;
|
||||
}
|
||||
8
33-search-in-rotated-sorted-array/soln.hpp
Normal file
8
33-search-in-rotated-sorted-array/soln.hpp
Normal 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);
|
||||
};
|
||||
Loading…
x
Reference in New Issue
Block a user