Bin search
This commit is contained in:
@@ -1,38 +1,66 @@
|
||||
#include "s0034_find_first_and_last_position_of_element_in_sorted_array.hpp"
|
||||
|
||||
vector<int> Solution::searchRange(vector<int>& nums, int target) {
|
||||
int size = nums.size();
|
||||
if (size <= 0) {
|
||||
return vector<int> {-1, -1};
|
||||
} else if (size == 1) {
|
||||
if (nums[0] == target) {
|
||||
return vector<int> {0, 0};
|
||||
// 闭区间写法
|
||||
vector<int> Solution1::searchRange(vector<int>& nums, int target) {
|
||||
int len = nums.size();
|
||||
int l{0};
|
||||
int r = len - 1;
|
||||
while (l <= r) {
|
||||
int m = (l + r) >> 1;
|
||||
if (target < nums[m]) {
|
||||
r = m - 1;
|
||||
} else if (nums[m] < target) {
|
||||
l = m + 1;
|
||||
} else {
|
||||
return vector<int> {-1, -1};
|
||||
}
|
||||
}
|
||||
int left{0};
|
||||
int right = size - 1;
|
||||
int mid;
|
||||
while (left <= right) {
|
||||
mid = static_cast<int>(floor((left + right) / 2));
|
||||
if (nums[mid] == target) {
|
||||
int resultLeft, resultRight;
|
||||
for (int i = mid; i < size; ++i) {
|
||||
if (nums[i] == target) {
|
||||
resultRight = i;
|
||||
l = r = m;
|
||||
while (l >= 0) {
|
||||
if (nums[l] == target) {
|
||||
--l;
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
for (int i = mid; i >= 0; --i) {
|
||||
if (nums[i] == target) {
|
||||
resultLeft = i;
|
||||
while (r <= len - 1) {
|
||||
if (nums[r] == target) {
|
||||
++r;
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
return vector<int> {resultLeft, resultRight};
|
||||
} else if (nums[mid] > target) {
|
||||
right = mid - 1;
|
||||
} else {
|
||||
left = mid + 1;
|
||||
return vector<int> {l + 1, r - 1};
|
||||
}
|
||||
}
|
||||
return vector<int> {-1, -1};
|
||||
}
|
||||
|
||||
// 开区间写法
|
||||
vector<int> Solution2::searchRange(vector<int>& nums, int target) {
|
||||
int len = nums.size();
|
||||
int l{0};
|
||||
int r = len;
|
||||
while (l < r) {
|
||||
int m = (l + r) >> 1;
|
||||
if (target < nums[m]) {
|
||||
r = m;
|
||||
} else if (nums[m] < target) {
|
||||
l = m + 1;
|
||||
} else {
|
||||
l = r = m;
|
||||
while (l >= 0) {
|
||||
if (nums[l] == target) {
|
||||
--l;
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
while (r <= len - 1) {
|
||||
if (nums[r] == target) {
|
||||
++r;
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
return vector<int> {l + 1, r - 1};
|
||||
}
|
||||
}
|
||||
return vector<int> {-1, -1};
|
||||
|
@@ -1,33 +1,37 @@
|
||||
#include "s0035_search_insert_position.hpp"
|
||||
|
||||
int Solution::searchInsert(vector<int>& nums, int target) {
|
||||
int size = nums.size();
|
||||
if (size == 0) {
|
||||
return 0;
|
||||
}
|
||||
int left{0};
|
||||
int right = size - 1;
|
||||
int mid;
|
||||
while (left <= right) {
|
||||
mid = static_cast<int>(floor((left + right) / 2));
|
||||
if (nums[mid] == target) {
|
||||
return mid;
|
||||
} else if (nums[mid] > target) {
|
||||
right = mid - 1;
|
||||
// 闭区间写法
|
||||
int Solution1::searchInsert(vector<int>& nums, int target) {
|
||||
int len = nums.size();
|
||||
int l{0};
|
||||
int r = len - 1;
|
||||
while (l <= r) {
|
||||
int m = (l + r) >> 1;
|
||||
if (target < nums[m]) {
|
||||
r = m - 1;
|
||||
} else if (nums[m] < target) {
|
||||
l = m + 1;
|
||||
} else {
|
||||
left = mid + 1;
|
||||
return m;
|
||||
}
|
||||
}
|
||||
if (right < 0) {
|
||||
return 0;
|
||||
} else if (left > size - 1) {
|
||||
return size;
|
||||
}
|
||||
if (target < nums[right]) {
|
||||
return right;
|
||||
} else if (target > nums[left]) {
|
||||
return left + 1;
|
||||
} else {
|
||||
return left;
|
||||
}
|
||||
return r + 1;
|
||||
}
|
||||
|
||||
// 开区间写法
|
||||
int Solution2::searchInsert(vector<int>& nums, int target) {
|
||||
int len = nums.size();
|
||||
int l{0};
|
||||
int r = len;
|
||||
while (l < r) {
|
||||
int m = (l + r) >> 1;
|
||||
if (target < nums[m]) {
|
||||
r = m;
|
||||
} else if (nums[m] < target) {
|
||||
l = m + 1;
|
||||
} else {
|
||||
return m;
|
||||
}
|
||||
}
|
||||
return r;
|
||||
}
|
||||
|
37
src/s0704_binary_search.cpp
Normal file
37
src/s0704_binary_search.cpp
Normal file
@@ -0,0 +1,37 @@
|
||||
#include "s0704_binary_search.hpp"
|
||||
|
||||
// 闭区间写法
|
||||
int Solution1::binSearch(vector<int>& nums, int target) {
|
||||
int len = nums.size();
|
||||
int l{0};
|
||||
int r = len - 1;
|
||||
while (l <= r) {
|
||||
int m = (l + r) >> 1;
|
||||
if (target < nums[m]) {
|
||||
r = m - 1;
|
||||
} else if (nums[m] < target) {
|
||||
l = m + 1;
|
||||
} else {
|
||||
return m;
|
||||
}
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
// 开区间写法
|
||||
int Solution2::binSearch(vector<int>& nums, int target) {
|
||||
int len = nums.size();
|
||||
int l{0};
|
||||
int r = len;
|
||||
while (l < r) {
|
||||
int m = (l + r) >> 1;
|
||||
if (target < nums[m]) {
|
||||
r = m;
|
||||
} else if (nums[m] < target) {
|
||||
l = m + 1;
|
||||
} else {
|
||||
return m;
|
||||
}
|
||||
}
|
||||
return -1;
|
||||
}
|
Reference in New Issue
Block a user