当前位置: 首页 > news >正文

【算法基础】二分查找

        二分查找算法利用数组的二段性,也就是数组可以被根据一定的规律分为两段,这两段具有不同的性质。

        时间复杂度:
                1次循环 ---> 剩 n/2
                2次循环 ---> 剩 n/4
                3次循环 ---> 剩 n/8
                ......
                m次循环 ---> 剩 1
                1 = n/n = n/(2的m次方)
                m = logn

1. 基础二分查找

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

class Solution {public int search(int[] nums, int target) {int head = 0, tail = nums.length - 1;while (head <= tail) {int mid = head + (tail - head) / 2;if (nums[mid] == target) {return mid;} else if (nums[mid] > target) {tail = mid - 1;} else {head = mid + 1;}}return -1;}
}

2. 二分查找左端点

        当 nums[mid] < target,此时 mid 落在的地方一定不是我们想要的。左端点一定在 (mid, tail) 中。

        当 nums[mid] >= target,有可能此时 mid 已经踩在了左端点,也有可能左端点尚在 mid 的左边。左端点一定在 (head, mid] 中。

        查找左端点时计算 mid 必须取左,因为 tail 每次会踩到 mid 上,如果 mid 取右,当 mid 与 tail 重合时会死循环。

    public int searchLeft(int[] nums, int target) {int head = 0, tail = nums.length - 1;while (head < tail) {int mid = head + (tail - head) / 2;if (nums[mid] < target) {head = mid + 1;} else {tail = mid;}}if (nums[head] == target && nums[tail] == target)return head;return -1;}

 35. 搜索插入位置 - 力扣(LeetCode)

        二段性:前一段中的元素均小于 target,后一段的元素均大于等于 target。

        找大于等于 target 的左端点。

162. 寻找峰值 - 力扣(LeetCode)

        二段性:由于题目只需要返回一个结果,任取一座山分析即可。每座山都能被分为上升区间和下降区间。

        找递减区间的左端点。判断条件应使用 nums[mid] 和 nums[mid + 1] 进行比较,因为查找左端点时 mid 要取左,比较时应取 mid 右面的元素。

153. 寻找旋转排序数组中的最小值 - 力扣(LeetCode)

        二段性:前一段中的元素均大于数组中的末位数,后一段中的元素均小于等于数组中的末位数。

        找小于等于数组末位数的左端点。

LCR 173. 点名 - 力扣(LeetCode)

        二段性:前一段元素 val = index,后一段元素 val = index + 1。

        找元素 val = index + 1 区间的左端点。

3. 二分查找右端点

        当 nums[mid] > target,此时 mid 落在的地方一定不是我们想要的。右端点一定在 (head, mid) 中。

        当 nums[mid] <= target,有可能此时 mid 已经踩在了右端点,也有可能右端点尚在 mid 的右边。右端点一定在 [mid, tail) 中。

        查找右端点时计算 mid 必须取右,因为 head 每次会踩到 mid 上,如果 mid 取左,当 mid 与 head 重合时会死循环。

    public int searchRight(int[] nums, int target) {int head = 0, tail = nums.length - 1;while (head < tail) {int mid = head + (tail - head + 1) / 2;if (nums[mid] > target) {tail = mid - 1;} else {head = mid;}}if (nums[head] == target && nums[tail] == target)return head;return -1;}

69. x 的平方根 - 力扣(LeetCode)

        二段性:前一段区间中元素的平方均小于等于 x,后一段区间中元素的平方均大于 x。

        找元素平方小于等于 x 的右端点。        

        注意:指针即是 val,不需要创建数组。数据需要用 long 接收。

http://www.dtcms.com/a/291253.html

相关文章:

  • 源码编译安装boost库,以及卸载boost库
  • 插值法的使用
  • Js进阶案例合集
  • iostat的使用说明
  • 基于深度学习的图像分类:使用ResNet实现高效分类
  • (10)机器学习小白入门 YOLOv:YOLOv8-cls 模型评估实操
  • G7打卡——Semi-Supervised GAN
  • numpy库的基础知识
  • 【VASP】机器学习势概述
  • 5G/4G PHY SoC:RNS802,适用于集成和分解的小型蜂窝 RAN 架构。
  • 在github上搭建自己主页
  • Blender软件入门-了解软件界面
  • JS逆向 - 滴滴(dd03、dd05)WSGSIG
  • Webpack源代码泄露漏洞
  • 云原生技术与应用-Kubernetes Pod调度基础
  • 热室机械手市场报告:智能装备推动高温制造自动化升级
  • 【推荐系统】推荐系统常用数据集介绍
  • 【系统全面】linux基础以及命令——基础知识介绍
  • stm32内存分析
  • ZYNQ硬核操作:免IIC驱动直控MCP4661T数字电位器
  • python实现接收九数云的异常分析指标推送通知
  • 海康威视视觉算法岗位30问及详解
  • 【开源】基于 C# 编写的轻量级工控网关和 SCADA 组态软件
  • 管理项目环境和在环境中使用conda或pip里如何查看库版本———Linux命令行操作
  • 工业仪表识别(一)环境安装
  • 一个月掌握数据结构与算法:高效学习计划
  • boost::asio 中 io_service与线程的关系
  • 企业开发转型 | 前端AI化数字化自动化现状
  • TestCase Studio - 自动生成测试用例详解
  • 注册表清理优化丨Wise RegistryCleaner_v11.1.10.725(官方赠品)