前言
欢迎大家积极在评论区留言发表自己的看法,知无不言,言无不尽,养成每天刷题的习惯,也可以自己发布优质的解题报告,供社区一同鉴赏,吸引一波自己的核心粉丝。
今天是新的开始 二分查找 🔥🔥
一、练习题目
二、算法思路
- 1、2089. 找出数组排序后的目标下标:🔥🔥这道题和35. 搜索插入位置是一个类型的题目,这个在之前《五月集训》(第九天)——二分查找已经有提到过。
// 大于等于target的数组下标模板
int bSearch(vector<int>& nums, int n, int target) {
int l = 0, r = n - 1;
int ans = n;
while (l <= r)
{
int mid = (l + r) >> 1;
if(nums[mid] >= target) {
ans = mid;
r = mid - 1;
} else {
l = mid + 1;
}
}
return ans;
}
三、源码剖析
// 2089. 找出数组排序后的目标下标
class Solution {
int bSearch(vector<int>& nums, int n, int target) {
int l = 0, r = n - 1;
int ans = n;
while (l <= r)
{
int mid = (l + r) >> 1;
if(nums[mid] >= target) {
ans = mid;
r = mid - 1;
} else {
l = mid + 1;
}
}
return ans;
}
public:
vector<int> targetIndices(vector<int>& nums, int target) {
sort(nums.begin(), nums.end());
int start = bSearch(nums, nums.size(), target);
int end = bSearch(nums, nums.size(), target + 1);
vector<int> ans;
for(int i = start; i < end; ++i) {
if(i < 0 || i > nums.size()) continue;
ans.emplace_back(i);
}
return ans;
}
};
- 1.利用二分查找找到大于等于target的最小下标,定好左右边界。