Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions Leetcode/34/ysuh/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
## Link
[Find First and Last Position of Element in Sorted Array](https://leetcode.com/problems/find-first-and-last-position-of-element-in-sorted-array/description/)

## Topic
binary search

## Approach
find the target via binary search
find the left and right via binary recursive search

## Note
49 changes: 49 additions & 0 deletions Leetcode/34/ysuh/solution.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
class Solution {
public:
vector<int> binarySearch(vector<int>& nums, int target, int start, int end) {
while (start <= end) {
int mid = (start + end) / 2;
if (nums[mid] == target) {
return {findLeft(nums, target, start, mid-1), findRight(nums, target, mid+1, end)};
} else if (nums[mid] > target) {
end = mid - 1;
} else {
start = mid + 1;
}
}
return {-1, -1};
}

int findLeft(vector<int>& nums, int target, int start, int end) {
while (start <= end) {
int mid = (start + end) / 2;
if (nums[mid] == target) {
return findLeft(nums, target, start, mid-1);
} else if (nums[mid] > target) {
end = mid - 1;
} else {
start = mid + 1;
}
}
return end + 1;
}

int findRight(vector<int>& nums, int target, int start, int end) {
while (start <= end) {
int mid = (start + end) / 2;
if (nums[mid] == target) {
return findRight(nums, target, mid+1, end);
} else if (nums[mid] > target) {
end = mid - 1;
} else {
start = mid + 1;
}
}
return start - 1;
}

vector<int> searchRange(vector<int>& nums, int target) {
if (!nums.size()) return {-1, -1};
return binarySearch(nums, target, 0, nums.size()-1);
}
};