当前位置:网站首页>[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;
}
};
边栏推荐
猜你喜欢
Nanny level explains Transformer
戳Web3的神话?戳到铁板。
一文搞懂什么是@Component和@Bean注解以及如何使用
CISP-PTE Zhenti Demonstration
【图像去噪】基于matlab稀疏表示KSVD图像去噪【含Matlab源码 2016期】
PHP 获取服务器信息
【着色器实现Glow可控局部发光效果_Shader效果第十三篇】
【第1天】SQL快速入门-基础查询(SQL 小虚竹)
Postman will return to results generated CSV file to the local interface
HCIP笔记整理 2022/7/18
随机推荐
STL - string
Nanny level explains Transformer
Oracle Rac Cluster File Directory Migration
Roson的Qt之旅#104 QML Image控件
戳Web3的神话?戳到铁板。
pt-online-schema-change工具使用的一次
多线程可见
uniapp 请求接口封装
商业智能BI业务分析思维:供应链分析 – 如何控制牛鞭效应(二)
Roson的Qt之旅#105 QML Image引用大尺寸图片
【Shell】3万字图文讲解带你快速掌握shell脚本编程
【云原生--Kubernetes】kubectl命令详解
七夕和程序员有毛关系?
pgaudit 的安装使用《postgresql》
volatile
剑指offer专项突击版第18天
请求与响应:响应
数据仓库指标体系实践
【C语言】函数栈帧的创建和销毁详解
华为设备配置BFD单跳检测二层链路