当前位置:网站首页>[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;
}
};
边栏推荐
猜你喜欢
随机推荐
加速FinOps实践,为企业降本增效
(十五)51单片机——呼吸灯与直流电机调速(PWM)
最新版图书馆招聘考试常考试题重点事业单位
qt学习之旅--MinGW32编译opencv3.0.0
924. 尽量减少恶意软件的传播 前缀和
解读 refresh 十二步骤
关于利用canvas画带箭头的直线旋转
剑指offer专项突击版第18天
DSP-ADAU1452输出通道配置
Detailed explanation of cause and effect diagram of test case design method
STL迭代器
【图像边缘检测】基于matlab灰度图像的积累加权边缘检测【含Matlab源码 2010期】
tmp
JS 原型原型链
【OpenCV】 - 显示图像API之imshow()对不同位深度(数据类型)的图像的处理方法
标准输入流
分治法求解中位数
重量级大咖来袭:阿里云生命科学与智能计算峰会精彩内容剧透
IEEE RAL投初稿
【着色器实现Glow可控局部发光效果_Shader效果第十三篇】