一起学算法(二分查找篇)

news2024/11/13 7:57:08

1.线性枚举

1.线性枚举定义

       线性枚举指的就是遍历某个一维数组(顺序表)的所有元素,找到满足条件的那个元素并且返回,返回值可以是下标,也可以是元素本身。

由于是遍历的,穷举了所有的情况,所以一定是可以找到解的,一些资料上也称为暴力算法

2.举例说明

给定一个单调递增的有序数组num和一个x,要求找到大于x的最小数的下标

我们可以将数组以x作为一个分界线,一部分是小于x,一部分是大于或等于x的

遍历去找指针由红色变到绿色的分界线,进行取值

2.二分枚举(具有单调性)

       二分枚举,也叫二分查找,指的是给定一个区间,每次选择区间的中点,并且判断区间中点是否满足某个条件,从而选择左区间继续求解还是右区间继续求解,直到区间长度不能再切分为止,由于每次都是把区间折半,又叫折半查找,时间复杂度O(logn),和线性枚举的求解结果一致,但是高效很多,返回的可以是下标也可以是值

栗子:

       假如你现在准备去做个实验,实验的内容是求出楼层最高多少层往下扔鸡蛋,鸡蛋不会碎,比如我们采用线性枚举,得从第一层扔,如果没碎,就在第二层层,假设鸡蛋能够承受的高度是50层,则我们得扔50次鸡蛋,钱包可撑不住O(n),但是我们使用二分枚举,第一次取半,在25层进行扔,如果碎了,我们就可以接着在0~25之间再进行取半操作,但是我们这个鸡蛋可是蛋中贵族,我们就需要在25~50层继续进行取半操作,这样时间复杂度就是O(logn)的,楼层越高,二分枚举的效率就越发的明显(万一你刚好一试,鸡蛋刚好没碎!!!)

1.普通的二分查找

 

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

2.左侧的二分查找

public int binarySearch(int [] nums,int target){
    int left=0;
    int right=nums.length;
    while(left<right){
        int mid=left+(right-left)/2;
        if(nums[mid]==target){
            right=mid;
        }else if(nums[mid]>target){
            //不断的缩右边界
            right=mid;
        }else{
            left=mid+1;
        }
    }
    return left;
}

3.右侧的二分查找

public int binarySearch(int [] nums,int target){
    int left=0;
    int right=nums.length;
    while(left<right){
        int mid=left+(right-left)/2;
        if(nums[mid]==target){
            right=left+1;
        }else if(nums[mid]>target){
            right=mid;
        }else{
            //不断的去缩左边界
            left=mid+1;
        }
    }
    return left-1;
}

       以上的模板在做题的过程中经常可以用得到,希望大家可以仔细的弄明白其中的原理,以后遇到就不用怕了

leetcood题单:

x的平方根

    //利用二分查找进行求解
    public int mySqrt(int x) {
     if(x==0||x==1){
         return x;
     }
     int r=find(x,0,x);
     return r-1;

    }

    public boolean isGree(int val,int x){
        return (long)val*val>x;
    }
    public int find(int x,int left,int right){
      if(left>right){
          return 0;
      }
      //找到最右侧的第一个红色
      while(left<right){
          int mid=left+(right-left)/2;
          if(isGree(mid,x)){
              right=mid;
          }else{
              left=mid+1;
          }
      }
      return left;
    }

第一个错误的版本

    public int firstBadVersion(int n) {
           int left = 1, right = n;
        while (left < right) { // 循环直至区间左右端点相同
            int mid = left + (right - left) / 2; // 防止计算时溢出
            if (isBadVersion(mid)) {
                right = mid; // 答案在区间 [left, mid] 中
            } else {
                left = mid + 1; // 答案在区间 [mid+1, right] 中
            }
        }
        // 此时有 left == right,区间缩为一个点,即为答案
        return left;
    }

早餐组合

   public int breakfastNumber(int[] staple, int[] drinks, int x) {
        Arrays.sort(drinks);
        Arrays.sort(staple);
        int left=0;
        int right=drinks.length-1;
        int count=0;
        int  MOD=1000000007;
        //左右
        while(left<staple.length&&right>=0){
            if(staple[left]+drinks[right]>x){
                 right--;
            }else{
                count=(count+right+1)%MOD;
                left++;
            }

        }
        return count;
    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/816078.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

iphone卡在恢复模式怎么办?修复办法分享!

iPhone 卡在恢复屏幕问题是 iPhone 用户在软件更新或恢复期间的常见问题。如果你也遇到此问题&#xff0c;不要着急&#xff0c;接下来我们将探讨 iPhone 卡在恢复屏幕上的主要原因&#xff0c;以及如何轻松修复它。 iPhone卡在恢复屏幕问题上没有一个特别的原因&#xff0c;但…

ALLEGRO之Route菜单

本文主要介绍了ALLEGRO的Route菜单。 &#xff08;1&#xff09;Connect&#xff1a;走线&#xff1b; &#xff08;2&#xff09;Slide&#xff1a;推挤&#xff1b; &#xff08;3&#xff09;Timing Vision&#xff1a;等长设计时使用&#xff1f;暂不清楚&#xff1b; &…

【动态规划算法】-子序列问题题型(27-34题)

&#x1f496;作者&#xff1a;小树苗渴望变成参天大树&#x1f388; &#x1f389;作者宣言&#xff1a;认真写好每一篇博客&#x1f4a4; &#x1f38a;作者gitee:gitee✨ &#x1f49e;作者专栏&#xff1a;C语言,数据结构初阶,Linux,C 动态规划算法&#x1f384; 如 果 你 …

svn还原本地代码

svn代码还原 问题描述&#xff1a;在vscode中修改了代码&#xff0c;没有提交&#xff0c;而且不小心点击了svn更新&#xff0c;导致本地修改的最新代码被覆盖&#xff0c;因为没有提交&#xff0c;所以远程仓库中也没有刚才修改的代码记录 解决&#xff1a; 通过vscode的时间…

远距离传输大型文件:如何应对不同地区的网络环境和带宽约束

在现代社会中&#xff0c;远程传输大文件已经变得非常常见了。无论是个人生活还是各种组织之间的合作和协作&#xff0c;都需要频繁地进行文件传输。但是&#xff0c;由于不同地区的网络状况和带宽限制&#xff0c;传输大文件可能会遇到很多问题。因此&#xff0c;如何应对不同…

PSP - 蛋白质序列搜索算法 MMseqs2 与 HHblits 的搜索结果差异

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/132025401 在 AlphaFold2 中&#xff0c;使用 HHblits 算法搜索 BFD 与 UniRef30&#xff0c;输出 bfd_uniref_hits.a3m 文件。MMseqs2 优化搜索速…

Selenium-用这个框架自动化任何你想做的事情!

Chrome DevTools 简介 Chrome DevTools 是一组直接内置在基于 Chromium 的浏览器&#xff08;如 Chrome、Opera 和 Microsoft Edge&#xff09;中的工具&#xff0c;用于帮助开发人员调试和研究网站。 借助 Chrome DevTools&#xff0c;开发人员可以更深入地访问网站&#xf…

职责链模式-请求的链式处理

在实际开发中&#xff0c;对于一个请求我们要经过层层过滤&#xff1a;身份验证 -> 权限验证 -> 实际业务处理。请求沿着一个链在传递&#xff0c;每一层都可以处理该请求。而“职责链模式”就是专门用于处理这种请求链式传递的模式。 1 职责链模式概述 避免将请求发送…

Kubernetes系列

文章目录 1 详解docker,踏入容器大门1.1 引言1.2 初始docker1.3 docker安装1.4 docker 卸载1.5 docker 核心概念和底层原理1.5.1 核心概念1.5.2 docker底层原理 1.6 细说docker镜像1.6.1 镜像的常用命令 1.7 docker 容器1.8 docker 容器数据卷1.8.1 直接命令添加1.8.2 Dockerfi…

2023-07-31 C语言根据错误号打印详细的错误信息perror(““) 或者strerror(errno)

一、C 语言可以使用perror("perror output"); 或 strerror(errno)打印详细的错误信息。 二、需要的头文件#include <errno.h>。 三、实例测试&#xff0c;这里我让open一个linux 底层杂项设备失败的情况&#xff0c;返回的是一个负数&#xff0c;强制返回-EN…

【shell】获取ping的时延数据并分析网络情况

网络情况经常让我们头疼&#xff0c;每次都需要手动在终端ping太麻烦了&#xff0c;不如写个脚本ping并将数据带上时间戳存入文件&#xff0c;然后也可以分析哪个时间段网络比较差。 创建一个demo.sh文件&#xff1a; #!/bin/bash # 清理日志 net_path"./network/"…

性能测试必备监控技能windows篇

前言 在手头没有专门的第三方监控时&#xff0c;该怎么监控服务指标呢&#xff1f;本篇就windows下监控进行分享&#xff0c;也是我们在进行性能测试时&#xff0c;必须掌握的。下面我们就windows下常用的三种监视工具进行说明&#xff1a; 任务管理器 资源监视器 性能监视器…

AD21 PCB设计的高级应用(一)BGA的扇出方式

&#xff08;一&#xff09;BGA的扇出方式 1.软件自动扇出方式2.手工扇出方式3.多种规格BGA的出现方式 1.软件自动扇出方式 在进行PCB设计时,常会遇到 BGA类型的封装&#xff0c;此类封装需要扇出用于后期的布线。BGA 扇出与否的比对如图所示。 (1)在进行利用软件自动扇出 BGA…

移动端适配布局rem和vw

在日益发展的移动互联网时代&#xff0c;作为前端开发者&#xff0c;我们必须了解和掌握各种移动端显示效果的适配技术。在众多适配方案中&#xff0c;使用rem和vw进行布局是当前最为流行和普遍使用的两种技术。通过合理运用这两种技术&#xff0c;我们可以让我们的网页在不同尺…

HCIP——前期综合实验

前期综合实验 一、实验拓扑二、实验要求三、实验思路四、实验步骤1、配置接口IP地址2、交换机配置划分vlan10以及vlan203、总部分部&#xff0c;骨干网配置OSPF分部总部骨干网 4、配置BGP建立邻居关系总部骨干网分部 5、发布用户网段6、将下一跳改为本地7、允许AS重复8、重发布…

揭秘!头条百科词条创建全过程及技巧解析

随着互联网时代的到来&#xff0c;人们获取信息的方式越来越便捷。作为国内领先的信息平台&#xff0c;头条百科成为了很多人查阅知识的首选。然而&#xff0c;如何在头条上创建百科词条&#xff0c;让更多人了解和熟知自己呢&#xff1f;本文伯乐网络传媒将为您揭开这个谜团&a…

何恺明把神经网络做深了,谷歌把神经网络的入口拉大了,又深又大,才成为今天的大模型

openai chatgpt 相关_个人渣记录仅为自己搜索用的博客-CSDN博客 大神回归学界&#xff1a;何恺明宣布加入 MIT 如今大模型都在使用的 transformer 的编码器和解码器&#xff0c;里面都有源自 ResNet 的残差链接。 「在 ResNet 之后就可以有效地训练超过百层的深度神经网络&…

Windows 实例如何开放端口

矩池云 Windows 实例相比于 Linux 实例&#xff0c;除了在租用机器的时候自定义端口外&#xff0c;还需要在 Windows防火墙中添加入口规则。接下来将教大家如何设置 Windows 防火墙&#xff0c;启用端口。 租用成功后通过 RDP 链接连接服务器&#xff0c;然后搜索防火墙&#x…

uniapp使用getStorage对属性赋值无效

1正常set(get)storage都是可以正常使用的 2.但对属性进行赋值的时候&#xff0c;却发现this.name并没有发生变化 3. 在里面打印this发现&#xff0c;在set*getStorage中并不能拿到this. 4.优化代码 这样就可以给this.name成功赋值

pinia 状态管理器详细文档记录,如何使用pinia看着一篇就够了!!!

目录 安装Pinia 定义store 1.option对象写法&#xff1a; 2.Setup 函数写法 使用store 接下来细化一下pinia的三大核心概念 state、action、getter 一、state 访问 state 重置 state 变更 state 替换 state 订阅 state 二、Getter 访问其他 getter 向 getter 传递…