文章目录
一、二分法
1.前提
- 有序数组
- 数组中一般无重复元素
2.应用场景
- 寻找一个数
- 寻找左侧边界
- 寻找右侧边界
二、经典题目
1.二分查找leetcode704题
分析:由于target的取值范围只能为[0, n - 1],
int left = 0,right = n - 1;(左闭右闭),while(left <= right);
class Solution {
public:
int search(vector<int>& nums, int target) {
int n = nums.size();
int left = 0, right = n - 1;
while(left <= right) {
int mid = left + (right - left) / 2;
if(nums[mid] == target) {
return mid;
} else if(nums[mid] < target) {
left = mid + 1;
} else {
right = mid - 1;
}
}
return -1;
}
};
2.搜索插入位置leetcode35题
分析:target的取值范围为[0, n],
int left = 0, right = n;(左闭右开) while(left < right);
class Solution {
public:
int searchInsert(vector<int>& nums, int target) {
int n = nums.size();
int left = 0, right = n;
while(left < right) {
int mid = left + (right - left) / 2;
if(nums[mid] < target) {
left = mid + 1;
} else {
right = mid;
}
}
return left;
}
};
3.在排序数组中查找元素的第一个和最后一个位置leetcode34题
class Solution {
public:
int getLeftBorder(vector<int>& nums, int target) {
int n = nums.size();
int left = 0, right = n - 1;
int leftBorder = -2;
while(left <= right) {
int mid = left + (right - left) / 2;
if(nums[mid] >= target) {
right = mid - 1;
leftBorder = right;
} else {
left = mid + 1;
}
}
return leftBorder;
}
int getRightBorder(vector<int>& nums, int target) {
int n = nums.size();
int left = 0, right = n - 1;
int rightBorder = -2;
while(left <= right) {
int mid = left + (right - left) / 2;
if(nums[mid] <= target) {
left = mid + 1;
rightBorder = left;
} else {
right = mid - 1;
}
}
return rightBorder;
}
vector<int> searchRange(vector<int>& nums, int target) {
int leftBorder = getLeftBorder(nums, target);
int rightBorder = getRightBorder(nums, target);
if (leftBorder == -2 || rightBorder == -2) {
return {-1, -1};
}
if (rightBorder - leftBorder > 1) {
return {leftBorder + 1, rightBorder - 1};
}
return {-1, -1};
}
};
参考资料
(1) leetcode官方题解
(2) 代码随想录
(3) https://leetcode.cn/problems/binary-search/solution/er-fen-cha-zhao-xiang-jie-by-labuladong/
(4) https://leetcode.cn/problems/search-insert-position/solution/te-bie-hao-yong-de-er-fen-cha-fa-fa-mo-ban-python-/