mirror of
https://github.com/20kaushik02/leetcode-gulag.git
synced 2025-12-06 07: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