首页 > 其他分享 >二分查找法学习心得(如何具体问题具体分析)

二分查找法学习心得(如何具体问题具体分析)

时间:2023-02-22 00:22:16浏览次数:42  
标签:二分 right 学习心得 mid len 区间 查找 具体分析 left

题目:

给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。

请必须使用时间复杂度为 O(log n) 的算法。

思路:

  • 做此题时,偶然读到了一篇非常好的关于二分查找法的博客,令我醍醐灌顶,明白了自己之前看二分法是如何的僵硬固化。
  1. 对于两种循环条件的选择
    • 有一些问题可以在循环之中找到答案,所以写法是 while(left <= right) ,循环体内是三个分支。更多的问题需要等到退出循环以后得到答案,所以写法是 while(left < right) ,循环体内是两个分支。
    • 若left = right进入循环体中但却找不到答案,left和right会处于交错的状态,不利于我们思考,因此选用 < 表示最后退出循环是left = right时,此时对left或right进行操作都可以。
  2. 要明确下一轮搜索区间是什么,进而设置左右边界,二分查找只有一个思想,那就是:逐步缩小搜索区间
  3. 两个易错点
    • 取 mid 的时候,有些时候需要 +1,这是因为需要避免死循环;这是因为 int mid = (left + right) / 2 在区间里有偶数个元素的时候,mid 只能取到位于左边的中间数,要想取到位于右边的中间数,就需要在括号里加 1。
    • 什么时候 right 取 len ?什么时候 right = len - 1。看题目,每个问题的答案都未必一样。
  4. 读题时,要确定元素找寻的条件,才能确定边界,不可套模板。要只把区间分成两个部分,这是因为:只有这样,退出循环的时候才有 left 与 right 重合,我们才敢说,找到了问题的答案。
  5. while (left < right) 不表示搜索区间为「左闭右开」,也不表示搜索区间为「左闭右闭」, 它们没有因果关系,while (left < right) 只表示它本来的意思:循环可以继续的条件是 left < right 。边界如何设置,这一点完全是人为定义的。
  6. 二分查找法在于我们能够根据题意:得到某种单调性,和可以逐步缩小搜索规模的条件,进而准确地设计可以使得搜索区间缩小的条件
  7. 退出循环 left == right,如果可以确定区间 [left..right] 一定有解,直接返回 left 就可以,否则还需要对 left 这个位置单独做一次判断;始终保持不变的是:在区间 [left..right] 里查找目标元素。

想法:

对于此题

题目要找的元素是:第一个大于等于 target 的元素的下标;
数组的长度 len 也有可能是问题的答案,设置 right = len 不是因为设置区间是「左闭右开」,而是因为 len 本来就有可能是问题的答案。

int len = nums.length;
        int left = 0;
        int right = len;
        // 在区间 nums[left..right] 里查找第 1 个大于等于 target 的元素的下标
        while (left < right) {
            int mid = left + (right - left) / 2;
            if (nums[mid] < target){
                // 下一轮搜索的区间是 [mid + 1..right]
                left = mid + 1;
            } else {
                // 下一轮搜索的区间是 [left..mid]
                right = mid;
            }
        }
        return left;

作者:liweiwei1419,感谢分享!!!

标签:二分,right,学习心得,mid,len,区间,查找,具体分析,left
From: https://www.cnblogs.com/isku-ran/p/17143000.html

相关文章

  • 第一个错误的版本(二分查找法)
    题目:你是产品经理,目前正在带领一个团队开发新的产品。不幸的是,你的产品的最新版本没有通过质量检测。由于每个版本都是基于之前的版本开发的,所以错误的版本之后的所有版本......
  • 2023.2.21 我的第一篇博客——软件工程学习心得体会
    今天是我第一次在博客园写博客,本人目前是上海海洋大学软件工程系大二在读,第一篇博客就聊聊我这一年半对软件工程学习的感想吧。编程语言方面,大一学习了C和C++,大二上学期学......
  • 带标号二分图计数
    本文中\(f[i]\)表示\([x^i]f(x)\)带标号的二分图的数量不方便用一个式子直接写出,我们考虑用别的统计去推出它。我们先求出连通二分图的生成函数,再求任意二分图的生成......
  • 软件工程个人学习心得
    Java应该是目前为止在软件开发领域使用最广的一种语言,学计算机的人员也始终绕不开Java。Java语言区别于其他语言的地方是,Java是在虚拟机上运行的,所以与平台无关,一串相......
  • 大一与大二软件工程专业学习心得与体会
    回顾即将两年的计算机专业大学生活,各种经历使我受益良多。在大一上半学期,我进行了c语言的学习。从老师的口中我得知,c语言是语言类中的基础,是我们成为一名成熟的程序员的第......
  • 二分法查找数字位置
    二分法举例请实现无重复数字的升序数组的二分查找给定一个元素升序的、无重复数字的整型数组nums和一个目标值target,写一个函数搜索nums中的target,如果目标值存在......
  • 体验AI乐趣:基于AI Gallery的二分类猫狗图片分类小数据集自动学习
    摘要:直接使用AIGallery里面现有的数据集进行自动学习训练,很简单和方便,节约时间,不用自己去训练了,AIGallery里面有很多类似的有趣数据集,也非常好玩,大家一起试试吧。本文......
  • 插入二分排序
    一、\(STL\)版本的插入二分排序#include<bits/stdc++.h>usingnamespacestd;constintN=6;inta[N]={3,2,1,4,5,7};voidBinInsertSort(inta[],intn......
  • ChatGPT学习心得一(使用node+react做了一个案例)
    ​ 项目地址http://chat.xutongbao.top项目截图​编辑​编辑​编辑 ​编辑 ​编辑使用技术栈node+SQLite+redis+nginx+log4js+express+jenkins+cdn+react+ant......
  • python 二分查找算法
    python二分查找算法 楔子如果有这样一个列表,让你从这个列表中找到66的位置,你要怎么做?l=[2,3,5,10,15,16,18,22,26,30,32,35,41,42,43,55,56,66,67,69,72,76,82,......