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

力扣-二分法想法

        二分法是折半算法,每次二分的时候,都能排除当前一半的数据,因此该算法的时间复杂度为O(log n) 是一种十分优的查找算法,也正是因为该极优的时间复杂度,也导致(或者是源于)对场景要求较为严格,必须是排序数组。当然,有时候我们也会在一些特殊场景中使用二分法,但本质还是基于排序数组的。

        我刷了不少关于二分法的题目,每次刷都会有不同的体会,我总结如下所示。

        1.不变量的思想:在二分法中,我们会有两个指针,一个左指针left 和一个右指针right 我们对这两个指针赋予的含义为:我们的搜索区间为[left,right],left是搜索区间的左边界,right是搜索区间的右边界,这层含义是不变的,变的是什么?是left和right具体的值,这也是必须变的,如果不变,区间也不会缩小。

        2.排除法的思想:比如在查找一个元素,此时搜索区间为[left, right] 我们不能保证元素一定在[left,right]区间之内,因为这个数组可能压根就没有这个元素,但我们可以确定是[0,left - 1]区间肯定没有目标元素,[right + 1, nums.length - 1]之间肯定也没有这个元素,而且,还有一点可以确认的是,[0, left - 1]之间的元素肯定是小于目标元素的,而[right + 1, nums.length - 1]之间的元素肯定是大于目标元素的,因为在代码中,我们就是这样来移动left和right指针的。

        我不知道大家对排除法思想有了解多少,以力扣的一道题目为例:35. 搜索插入位置

        首先,如果不用二分查找法,我们直接暴力遍历就行,从左向右找,找到第一个大于目标元素的位置(针对不存在目标元素的情况)。

        在排除法中,我们说过[right + 1, nums.length - 1]是永远大于目标元素的;而[0, left - 1]是永远小于目标元素的,我也不知道这算不算是不变量的一种体现。当我们在数组中找不到目标元素的时候,最后满足left = right + 1,所以从left这个位置开始,往后,都是大于目标元素的,而在left之前所有元素都是小于目标元素的,这时候,我们找到了第一个大于目标元素的位置,就是left

        补充:

        1. 关于开闭区间的问题:[left, right]和[left,right) 其实,我觉得没必要纠结。因为这两种是可以转换的,如果我们掌握了[left,right]的写法,那么对于[left,right) 其实是可以转换为闭区间的:[left, right - 1] 在[left, right]闭区间的基础上,把right改为right - 1即可。

        


文章转载自:

http://MvnHydxq.hsksm.cn
http://yhqUfCFA.hsksm.cn
http://phZCvcmZ.hsksm.cn
http://8h3rKKiA.hsksm.cn
http://CVFPvhMp.hsksm.cn
http://bTIEJVQA.hsksm.cn
http://DnSG3xyZ.hsksm.cn
http://cHME89YM.hsksm.cn
http://mMkF95tl.hsksm.cn
http://tZlR5ErK.hsksm.cn
http://xT2ms0nS.hsksm.cn
http://XsNVFOBl.hsksm.cn
http://AiGff5MP.hsksm.cn
http://eauZUj9N.hsksm.cn
http://XGOTHBp7.hsksm.cn
http://srGwqNjb.hsksm.cn
http://Ba6Sa2OY.hsksm.cn
http://jlcPfAol.hsksm.cn
http://qgDGuf03.hsksm.cn
http://f8NX73sU.hsksm.cn
http://Bm8WxkLl.hsksm.cn
http://XyvMonpH.hsksm.cn
http://Fr5LXXIo.hsksm.cn
http://FYlG2r5f.hsksm.cn
http://Ig64krdT.hsksm.cn
http://ykVmcVHr.hsksm.cn
http://ExI6uA4g.hsksm.cn
http://bA2btn18.hsksm.cn
http://qG0gSD7m.hsksm.cn
http://JwvJclwQ.hsksm.cn
http://www.dtcms.com/a/367538.html

相关文章:

  • simple-check-100
  • 自学嵌入式第三十五天:网络编程-网站
  • 分词器详解(二)
  • Webug3.0通关笔记18 中级进阶第06关 实战练习:DisCuz论坛SQL注入漏洞
  • Docker学习记录
  • springboot配置多数据源(mysql、hive)
  • 机器学习如何精准预测高值
  • 【单片机day03】
  • More Effective C++ 条款28:智能指针
  • 洛谷 P3384 【模板】重链剖分/树链剖分-提高+/省选-
  • Websocket链接如何配置nginx转发规则?
  • Linux网络服务——基础设置
  • bd09转2gs84坐标算法
  • Python可视化93阅兵武器进化
  • 适应新环境:Trae编辑器下的IDEA快捷键定制
  • AgentThink:一种在自动驾驶视觉语言模型中用于工具增强链式思维推理的统一框架
  • 2025年数学建模国赛B题超详细解题思路
  • CSDN 与 掘金 高效学习指南
  • Web基础、HTTP/HTTPS协议与Nginx详解
  • 深度学习篇---MNIST:手写数字数据集
  • 【算法速成课2 | 题单】背包问题
  • RAG学习
  • Netty从0到1系列之Buffer【上】
  • Flutter之riverpod状态管理Widget UI详解
  • 投标委托测试如何选择第三方检测机构?
  • 记录SSL部署,链路不完整问题
  • Unity Standard Shader 解析(五)之ShadowCaster
  • go 初始化组件最佳实践
  • 2025数学建模国赛高教社杯A题思路代码文章助攻
  • deveco 出现hvigor版本与系统版本不匹配