【算法入门】二分查找

简介: 二分查找

70b7363df2046bf2af05d42bb9e5b1a.png

前言

二分查找是一种在有序数组中查找某一特定元素的搜索算法,在很多人的印象里,二分查找是一种比较简单的算法,然而在实际做题中,二分查找经常容易写错,特别是在处理边界条件的时候,今天我们就来聊一聊二分查找,看能不能找到一种比较简单,通用的方法来解决大部分的二分查找问题

先看一个例子

先给定一个数组

const list = [1, 2, 3, 5, 5, 5, 8, 9]
复制代码

思考下面4个问题

  • 找到第一个 >=5 的元素
  • 找到最后一个 <5 的元素
  • 找到第一个 >5 的元素
  • 找到最后一个 <=5 的元素

先简单想想来看下答案

6a038ac799969197a2e09fc4f48566f.png

以上其实就是我们在使用2分查找时经常会遇到的各种边界问题,而对于边界问题的处理,常常决定着最终结果的准确

如何分析问题

对于二分查找的问题,都可以抽象为在一个有序数组中寻找边界,以下以寻找蓝,红方块边界为例,最开始拿到数组是白色的,通过一次又一次的查找,去扩大蓝色 (左指针右移 left + 1) 和红色区域 (右指针左移 right - 1) ,最终找到边界 (即求出未知数K)

7ba683572604bbaf25654f03e9214cb.png

解题模板

大家来看一段伪代码

left = -1, right = n
while left + 1 != right
    m = (left + right) / 2
    if IsBlue(m) 
        left = m
    else
        right = m
return left or right
复制代码

做一道 leetCode 题

704. 二分查找 - 力扣(LeetCode)

给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。

分析

二分查找都可以看做找边界 target 的问题,本题 left 左区域的值都小于 target (即蓝色区域) ,右边界的值都大于 target (即红色区域) ,而等于时即求出边界

解题

/**
 * @param {number[]} nums
 * @param {number} target
 * @return {number}
 */
var search = function(nums, target) {
    let left = -1
    let right = nums.length
    while(left + 1 != right) {
        let middle = (left + right) >> 1 // 使用 >> 位运算代替除法避免小数
        if (nums[middle] == target) {
            return middle
        }
        if (nums[middle] > target) {
            right = middle
        }
        if (nums[middle] < target) {
            left = middle
        }
    }
    return -1 
};
复制代码

怎么样,大家可以试试用这个解题模板去试试,看是否能让你做二分查找相关的题目时准确率更高些 ^-^

相关文章
|
15小时前
|
存储 算法 索引
【优选算法】—— 二分查找
【优选算法】—— 二分查找
|
15小时前
|
机器学习/深度学习 存储 缓存
数据结构从入门到精通——算法的时间复杂度和空间复杂度
算法的时间复杂度和空间复杂度是评估算法性能的两个重要指标。时间复杂度主要关注算法执行过程中所需的时间随输入规模的变化情况,而空间复杂度则关注算法执行过程中所需的最大存储空间或内存空间。
83 0
|
15小时前
|
搜索推荐 算法 C语言
C语言选择排序算法,从入门到精通只需1秒!
C语言选择排序算法,从入门到精通只需1秒!
|
15小时前
|
算法 前端开发
|
15小时前
|
算法 程序员 数据处理
算法与人生 揭秘C语言中高效搜索的秘诀——二分查找算法详解
算法与人生 揭秘C语言中高效搜索的秘诀——二分查找算法详解
|
15小时前
|
人工智能 算法 测试技术
【动态规划】【二分查找】C++算法 466 统计重复个数
【动态规划】【二分查找】C++算法 466 统计重复个数
|
15小时前
|
存储 机器学习/深度学习 算法
|
15小时前
|
机器学习/深度学习 人工智能 算法
分类算法入门:以鸢尾花数据集为例(上)
分类算法入门:以鸢尾花数据集为例(上)
36 2
|
15小时前
|
机器学习/深度学习 算法 数据可视化
分类算法入门:以鸢尾花数据集为例(下)
分类算法入门:以鸢尾花数据集为例(下)
54 2
|
15小时前
|
算法 测试技术 Serverless
【二分查找】【C++算法】378. 有序矩阵中第 K 小的元素
【二分查找】【C++算法】378. 有序矩阵中第 K 小的元素