首页 > 其他分享 >labuladong_二分查找

labuladong_二分查找

时间:2024-03-14 09:22:59浏览次数:23  
标签:二分 ... right mid else 查找 labuladong left

零、二分查找框架

复制代码
func binarySearch(nums []int, target int)int {
    left := 0, right := ...

    for ...  {
        mid := left + (right - left) / 2;
        if (nums[mid] == target) {
            ...
        } else if nums[mid] < target {
            left = ...
        } else if nums[mid] > target {
            right = ...
        }
    }
    return ...
}
复制代码

分析二分查找的一个技巧是:不要出现 else,而是把所有情况用 else if 写清楚,这样可以清楚地展现所有细节。本文都会使用 else if,旨在讲清楚,读者理解后可自行简化。

其中 ... 标记的部分,就是可能出现细节问题的地方,当你见到一个二分查找的代码时,首先注意这几个地方。后文用实例分析这些地方能有什么样的变化。

另外声明一下,计算 mid 时需要防止溢出,代码中 left + (right - left) / 2 就和 (left + right) / 2 的结果相同,但是有效防止了 left 和 right 太大直接相加导致溢出

标签:二分,...,right,mid,else,查找,labuladong,left
From: https://www.cnblogs.com/zhihongShee/p/18072087

相关文章

  • 蓝桥杯算法训练VIP-数组查找及替换
    题目1634:蓝桥杯算法训练VIP-数组查找及替换时间限制:3s内存限制:192MB提交:1629解决:890题目描述给定某整数数组和某一整数b。要求删除数组中可以被b整除的所有元素,同时将该数组各元素按从小到大排序。如果数组元素数值在A到Z的ASCII之间,替换为对应字母。输......
  • 二分+前缀和——洛谷P1314
    1.公式解读[...]  括号内内容为真则其值等于1,内容为假则其值等于0 2.思路这是一个关于单调性判定的问题,当W不断增大,差值由大变小再变大(实际是从负到0到正,只不过要取绝对值,不影响它的单调性),而目标则是在0的附近找到一个绝对值最小的值,因此是一道二分答案题,但如果......
  • C++ | 二分(重点二分答案)
    常见的二分类型:1.整数二分2.小数二分(相对较少)3.二分答案(最常见)二分最直接的思想就是用O(logn)的时间较快的在数组中找见想要找的边界数,枚举时间较慢O(n)。 小数二分与整数二分的思想相一致,就不在赘述了。☆ 理解二分一定要理解的问题是答案取得是区间的右边界,则返回......
  • 二分查找
    题目描述:输入数组长度n输入数组a[1...n]输入查找个数m输入查找数字b[1...m]输出YESorNO查找有则YES否则NO。输入:输入有多组数据。每组输入n,然后输入n个整数,再输入m,然后再输入m个整数(1<=m,n<=100)。输出:如果在n个数组中输出YES否则输出NO。......
  • 旅游(最小生成树&二分)---牛客小白月赛69-D
    #include<bits/stdc++.h>usingnamespacestd;#defineintlonglong#defineendl'\n'#defineinf0x3f3f3f3fconstintN=4e4+5;intn,m,c;intp[N];structnode{ intx,y,w; booloperator<(constnode&t)const{ returnw<t.w; ......
  • find 查找文件并清空文件内容
    简介日常运维操作少不了清理日志这一步骤,但不建议直接rm操作,一个是怕删错,二是如果程序在引用该文件,贸然进行删除会导致文件句柄并未得到释放,会占用额外的存储空间,所以建议用find查找出来进行滞空操作内容注意:以下是示例,记得更换目录第一种方法:find /var/lib/docker/cont......
  • 二分答案&前缀和&差分&离散化(简记)
    二分答案基本codeintFind(intl,intr){ intans,mid; while(l<=r) { intmid=l+r>>1; if(Check(mid))ans=mid,r=mid-1;//舍弃右半部分 elsel=mid+1;//舍弃左半部分 } returnans;}前缀和基本code#inlcude<bits/stdc++.h>usingnamespacestd;intsum[100......
  • 从CF1702E看二分图判断的两种方法
    https://www.luogu.com.cn/problem/CF1702E转化题意把所有数连边,判断是否为二分图。染色法voidsolve(){#definetestsintn;std::cin>>n;std::map<int,std::vector<int>>edge;std::vector<bool>used(n+1);boolok(true);......
  • LeetCode[题解] 1261. 在受污染的二叉树中查找元素
    首先我们看原题给出一个满足下述规则的二叉树:root.val==0如果 treeNode.val==x 且 treeNode.left!=null,那么 treeNode.left.val==2*x+1如果 treeNode.val==x 且 treeNode.right!=null,那么 treeNode.right.val==2*x+2现在这个二叉树受到「污......
  • 02-数组、排序、查找
    数组数组是一种引用数据类型,所以数组对象实际上存储在堆内存当中数组实际上是一种容器,可以容纳多个元素数组中存储的是基本数据类型的数据,或者是引用数据类型的引用(不能直接存储Java对象)长度不可变,起始位置是0,最后一个下标是length-1所有的数组对象都有length属性Java中......