当前位置:网站首页>[Hello World] 二分查找笔记
[Hello World] 二分查找笔记
2022-08-03 06:48:00 【万俟淋曦】
活动地址:CSDN21天学习挑战赛
一、介绍
1.1 定义
二分查找(Binary Search)也称折半查找,它是一种效率较高的查找方法。
1.2 前提条件
数列必须有序,对于无序数列,必须先进性排序才能用二分查找。
1.3 原理
检查一定区间内有序元素的中间位置,将其与所查找元素进行比较,如果大于所找元素,继续在左半区间查找,如果小于所找元素,则在右半区间查找,重复上述过程,直到找到所找元素或查找失败。
1.4 局限性
- 需要操作有序数列
- 由于需要根据下标随机访问,所以该算法依赖于数组
- 非常小和非常大的数列都不适合
非常小可以使用顺序算法,非常大
1.5 复杂度
时间复杂度:O(lgn)
空间复杂度:O(1)
二、代码示例
二分查找的实现需要注意区间的开闭问题,对于全闭空间,如[left, right],边界判断要使用等号。
C++代码如下:
int binarySearch(vector<int>& nums, target)
{
int left = 0;
int right = num.size() - 1;
while (left <= right)
{
int middle = left + ((right - left) / 2);
if (nums[middle] > target)
{
right = middle - 1;
}
else if (nums[middle] < target)
{
left = middle + 1;
}
else
{
return middle;
}
}
return -1
}
如果存在开区间,如[left, right),边界判断不使用等号。
C++代码如下:
int binarySearch(vector<int>& nums, target)
{
int left = 0;
int right = num.size();
while (left < right)
{
int middle = left + ((right - left) / 2);
if (nums[middle] > target)
{
right = middle;
}
else if (nums[middle] < target)
{
left = middle + 1;
}
else
{
return middle;
}
}
return -1
}
二、实践
class Solution {
public:
int search(vector<int>& nums, int target) {
int l = 0, r = nums.size()-1, mid = 0;
while(l <= r){
mid = (l + r) >> 1;
if(nums[mid] > target) r = mid - 1;
else if(nums[mid] < target) l = mid + 1;
else return mid;
}
return -1;
}
};
class Solution {
public:
int binarySearch(vector<int>& nums, int target, bool lower) {
int left = 0, right = (int)nums.size() - 1, ans = (int)nums.size();
while (left <= right) {
int mid = (left + right) / 2;
if (nums[mid] > target || (lower && nums[mid] >= target)) {
right = mid - 1;
ans = mid;
} else {
left = mid + 1;
}
}
return ans;
}
vector<int> searchRange(vector<int>& nums, int target) {
int leftIdx = binarySearch(nums, target, true);
int rightIdx = binarySearch(nums, target, false) - 1;
if (leftIdx <= rightIdx && rightIdx < nums.size() && nums[leftIdx] == target && nums[rightIdx] == target) {
return vector<int>{
leftIdx, rightIdx};
}
return vector<int>{
-1, -1};
}
};
class Solution {
public int searchInsert(int[] nums, int target) {
int n = nums.length;
int left = 0, right = n - 1, ans = n;
while (left <= right) {
int mid = ((right - left) >> 1) + left;
if (target <= nums[mid]) {
ans = mid;
right = mid - 1;
} else {
left = mid + 1;
}
}
return ans;
}
};
边栏推荐
猜你喜欢
随机推荐
请手撸5种常见限流算法!面试必备
多线程案例
HCIP笔记整理 2022/7/18
开放域OOD主要数据集、评价指标汇总
The ORB - SLAM2 extracting feature points
重量级大咖来袭:阿里云生命科学与智能计算峰会精彩内容剧透
训练正常&异常的GAN损失函数loss变化应该是怎么样的
Flutter | 判断 Text 组件是否显示完
【RT_Thread学习笔记】---以太网LAN8720A Lwip ping 通网络
一文搞懂什么是@Component和@Bean注解以及如何使用
分布式数据库数据一致性的原理、与技术实现方案
drop database出现1010
Roson的Qt之旅#106 QML在图片上方放置按钮并实现点击按钮切换图片
CDGA|如何加强数字政府建设?
线程基础(二)
多线程打印ABC(继承+进阶)
【云原生--Kubernetes】Pod容器与镜像拉取策略
商业智能BI业务分析思维:供应链分析 – 如何控制牛鞭效应(二)
(十四)51单片机——LCD1602实现滚动效果
postman将接口返回结果生成json文件到本地









