前言: 其实我不想写具体的什么是二分查找? 这篇文章主要是针对要查找的值来看看代码, 因为我们不是每次都要找到目标值, 也有可能要找的数组中没有目标值
二分查找(binary search)是一种基于分治策略的高效搜索算法。它利用数据的有序性( 排序的数组必须有序 ),每轮缩小一半搜索范围,直至找到目标元素或搜索区间为空为止。
Question
给定一个长度为 n 的数组 nums ,元素按从小到大的顺序排列且不重复。请查找并返回元素 target 在该数组中的索引。若数组不包含该元素,则返回 -1.
1. 查找目标值是否存在
无重复 / 有重复都能用,但只返回任意一个匹配位置
java
int find(vector<int>& nums, int target ) {
int l = 0; r = nums.size()-1;
while(l<=r){
int l = 0, r = nums.size()-1;
while(l<=r){
int mid=l+(r-l)/2;
if(nums[mid]==target) return mid;
else if(nums[mid]<target) l=mid+1;
else r=mid-1;
}
return -1;
}
}
2. 左边界(第一个 >= target / 重复最左 / 插入位置)
功能:
找第一个 ≥ target 的位置
重复元素 → 返回最左边那个
没找到 → 返回应该插入的位置
java
int leftBound(vector<int>& nums, int target) {
int l = 0, r = nums.size() - 1;
int ans = nums.size(); // 默认插到末尾
while (l <= r) {
int mid = l + (r - l) / 2;
if (nums[mid] >= target) {
ans = mid; // 记录答案
r = mid - 1; // 继续往左找更早的
} else {
l = mid + 1; // 太小,去右边
}
}
return ans;
}
作用:
找第一个 >= target
找重复元素最左边
找插入位置
找第一个大于 target(只需把 >= 改成 >)
三、右边界二分
功能:
找最后一个 ≤ target 的位置
重复元素 → 返回最右边那个
java
int rightBound(vector<int>& nums, int target) {
int l = 0, r = nums.size() - 1;
int ans = -1;
while (l <= r) {
int mid = l + (r - l) / 2;
if (nums[mid] <= target) {
ans = mid; // 记录答案
l = mid + 1; // 继续往右找更晚的
} else {
r = mid - 1; // 太大,去左边
}
}
return ans;
}
小白啊!!!写的不好轻喷啊🤯如果觉得写的不好,点个赞吧🤪(批评是我写作的动力)
...。。。。。。。。。。。...
...。。。。。。。。。。。...