二分法问题

 日升时奋斗,日落时自省

目录

1、二分法

2、二分法问题

 2.1 、在排序数组中查找元素的第一个和最后一个位置

2.2、搜索插入位置

2.3、山脉数组的峰顶索引

2.4、0-n-1中缺失的数字


1、二分法

二分法是比较简单的一种查找算法,但是效率很高,很多友友们也会觉得二分法没有什么好说的,就是取中,对比,位置变化,其实大体上也就是这么三个

注:二分法适用条件 有二段性 ,其实就是有规律的分段,排序就是其中常见的一种

第一类普通二分法:

代码:

    public static int search(int[] nums,int target){
        //二分范围就是 具有二段性的范围 这里是一个排序好的数组具有 二段性
        //left就是左边界 right 就是右边界
        int left = 0,right =nums.length-1;
        //判断条件 为什么会有等于
        //因为这里是为了可以找到 我们要的 并且存在的下标
        //等于的情况就是我们需要找的 
        while (left<=right){
            int mid = left + (right - left) /2;
            //如果目标值大于中间值  left给小了
            //target的存在位置一定大于mid left是当前区间最小位置 更新这里left的位置就是mid+1
            if(target>nums[mid]){
                left=mid+1;
            //如果目标值小于中间值  right给大了
            //target的存在位置一定小于mid right是当前区间最大位置 更新这里right的位置就是mid-1
            }else if(target<nums[mid]){
                right=mid-1;
            }else {
                return mid;
            }
        }
        return -1;
    }

第二种就是找左边界值(二分法):

有没有见过1,2,3,4,4,4,4,5,7,8这种需要你找到当前元素中找到最左边4的位置

这就是特殊类型的二分法了

注:建议先看代码在看图

图示:

代码:

    public static int search(int[] nums,int target){
        int left = 0, right = nums.length - 1;
        //不在是为了找到 对应的值 而是一个极端的下标 
        //所以没有等号
        while(left<right){
            //寻找左端点   (right-left)/2 是靠左的
            int mid = left + (right - left)/2;
            if(nums[mid]<target){
                //目标值大于 中间值 说明left偏小
                left=mid+1;
            }else {
                //right不同 如果target小等于 right边小到 mid 位置
                //为啥呢 因为 target==nums[mid] 那此时极端下标就是mid
                //right等于相等情况的下标 mid
                right=mid;
            }
        }
        //left==right 此时  所以返回right也可以  
        return left;
    }

第二种就是找右边界值(二分法):

有没有见过1,2,3,4,4,4,4,5,7,8这种需要你找到当前元素中找到最右边4的位置

这就是特殊类型的二分法了

注:方法大体相同

mid = left + (right - left + 1)/2 表示取值靠右

剩下的就是条件了

图示:

代码:

public static int search(int[] nums,int target){
        int left = 0, right = nums.length - 1;
        //不在是为了找到 对应的值 而是一个极端的下标
        //所以没有等号
        while(left<right){
            //寻找左端点   (right-left+1)/2 是靠右的
            int mid = left + (right - left+1)/2;
            if(nums[mid]>target){
                //目标值小于 中间值 说明right偏大
                right=mid-1;
            }else {
                //right不同 如果target大等于 left边小   到mid 位置
                //为啥呢 因为 target==nums[mid] 那此时极端下标就是mid
                //left等于相等情况的下标 mid
                left=mid;
            }
        }
        //left==right 此时  所以返回right也可以
        return left;
    }

2、二分法问题

 2.1 、在排序数组中查找元素的第一个和最后一个位置

题目来源:. - 力扣(LeetCode)

其实就是把两种特殊二分进行使用 找左值 也 找右值

代码:

    public int[] searchRange(int[] nums, int target) {
        //题目说了要两个 下标 咱们建立一个数组来放置
        int[] ret=new int[2];
        //例题已经给了 要求为空 数组返回 -1 -1
        if(nums.length==0){
            return new int[]{-1,-1};
        }
        //二分两边的位置  
        int left =0, right=nums.length-1;
        //寻找左端点
        while(left<right){
            //选择条件靠左
            int mid = left+(right-left)/2;
            if(nums[mid]<target){
                left=mid+1;
            }else if(nums[mid]>=target){
                right=mid;
            }
        }
        //此时进行一次判断 如果left没有找到也就是没有目标值
        if(nums[left]!=target){
            //不存在直接返回 -1 -1
            return new int[]{-1,-1};
        }
        //记录一下
        ret[0]=left;
        //其实这里 可以不用在初始化的 
        //为了方便友友们看懂
        left=0;right=nums.length-1;
        //寻找右端点
        while(left<right){
            //靠右条件
            int mid =left+(right-left+1)/2;
            if(nums[mid]>target){
                right=mid-1;
            }else if(nums[mid]<=target){
                left=mid;
            }
        }
        //记录右下标
        ret[1]=left;
        return ret;
    }

注:不要害怕长,整个代码都是前面的代码构成的,算是套模板

2.2、搜索插入位置

题目来源:. - 力扣(LeetCode)

在一个数组中找目标元素,如果存在返回下标,如果不存在找到排序好的下标

代码:

    public int searchInsert(int[] nums, int target) {
        int left=0,right=nums.length-1;
        while(left<right){
            //找右值
            int mid=left+ (right-left+1)/2;
            if(nums[mid]<=target){
                left=mid;
            }else{
                right=mid-1;
            }
        }
        //如果目标值大于left 说明没有找到 
        //此时left+1就是排序好的下标
        if(nums[left]<target){
            return left+1;
        }else {
            //相等就是找到了
            return left;
        }
    }

2.3、山脉数组的峰顶索引

题目来源:. - 力扣(LeetCode)

图示:

代码:

    public int peakIndexInMountainArray(int[] arr) {
        int left=0,right=arr.length-2;
        while(left<right){
            //靠右取条件
            int mid=left+(right-left+1)/2;
            //数组遵循大体就是   /\
            //               /  \
            //              /    \   在一定区间内有二段性  
            //所以每次目标值都是mid-1的位置
            if(arr[mid]>arr[mid-1])left=mid;
            //如果小于说明right 太大了
            else right=mid-1;
        }
        return left;
    }

2.4、0-n-1中缺失的数字

这个暂时在leetcode上没有找到合适的,友友们作为练手,leetcode上有些题有些变动,原来是有的,现在可以能题目名字变了

1  2   3   4   5  6  8  9  10 少了个7

注:其实这里普通二分法也能解决问题,这里没有用普通二分,使用找左端点的二分法

代码:

    public static void main(String[] args) {
        int[] nums={0,1,2,3,4,5,6,7,8,9,10};
        System.out.println(missingNumber(nums));
    }
    public static int missingNumber(int[] nums){
        int left = 0, right = nums.length-1;
        while(left<right){
            //靠左条件
            int mid = left + (right-left)/2;
            if(nums[mid]==mid){
                left=mid+1;
            }else {
                right=mid;
            }
        }
        //如果找到了 小的了 说明缺下一个位置 left+1 
        return nums[left]==left?left+1:left;
    }

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【创建型模式】原型模式

一、原型模式概述 原型&#xff08;Prototype&#xff09;模式的定义&#xff1a;用一个已经创建的实例作为原型&#xff0c;通过复制该原型对象来创建一个和原型相同或相似的新对象。在这里&#xff0c;原型实例指定了要创建的对象的种类。用这种方式创建对象非常高效&#xf…

【Qt】Qt安装包、源码、子模块(submodules)下载

1、Qt 4.0 ~ Qt5.14 Qt 4.0 ~ Qt5.14 离线安装包、源码和子模块(submodules)源码下载路径: https://download.qt.io/new_archive/qt/以Qt5.7.1为例,注意子模块都是源码,需要独立编译 2、Qt5.15 ~ Qt6.7 Qt5.15 ~ Qt6.7源码和子模块(submodules)源码下载路径: htt…

分类算法——决策树(五)

认识决策树 决策树思想的来源非常朴素&#xff0c;程序设计中的条件分支结构就是if-else结构&#xff0c;最早的决策树就是利用这类结构分割数据的一种分类学习方法。 决策树分类原理详解 为了更好理解决策树具体怎么分类的&#xff0c;通过一个问题例子&#xff1a; 问题…

【MIT6.824】lab3 Fault-tolerant Key/Value Service 实现笔记

引言 lab3A的实验要求如下&#xff1a; Your first task is to implement a solution that works when there are no dropped messages, and no failed servers. You’ll need to add RPC-sending code to the Clerk Put/Append/Get methods in client.go, and implement Pu…

HiveSql中的函数家族(二)

一、窗口函数 1、什么是窗口函数 在 SQL 中&#xff0c;窗口函数&#xff08;Window Functions&#xff09;是一种特殊的函数&#xff0c;它允许在查询结果集的特定窗口&#xff08;通常是一组行&#xff09;上执行聚合、分析和计算操作&#xff0c;而无需聚合整个结果集。窗口…

使用Python工具库SnowNLP对评论数据标注(二)

这一次用pandas处理csv文件 comments.csv import pandas as pd from snownlp import SnowNLPdf pd.read_csv("C:\\Users\\zhour\\Documents\\comments.csv")#{a: [1, 2, 3], b: [4, 5, 6], c: [7, 8, 9]}是个字典 emotions[] for txt in df[sentence]:s SnowNLP(…

接收区块链的CCF会议--ICSOC 2024 截止7.24

ICSOC是CCF B类会议&#xff08;软件工程/系统软件/程序设计语言&#xff09; 2023年长文短文录用率22% Focus Area 4: Emerging Technologies Quantum Service Computing Digital Twins 3D Printing/additive Manufacturing Techniques Blockchain Robotic Process Autom…

【QT+OpenCV】车牌号检测 学习记录 遇到的问题

【QTOpenCV】车牌号检测 学习记录 首先在QT里面配置好OpenCV .pro文件中加入&#xff1a; INCLUDEPATH G:/opencv/build/include LIBS -L"G:/opencv/build/x64/vc14/lib"\-lopencv_core \-lopencv_imgproc \-lopencv_highgui \-lopencv_ml \-lopencv_video \-lo.c…

Meta Llama 3强势来袭:迄今最强开源大模型,性能媲美GPT-4

前言 Meta的最新语言模型Llama 3已经发布&#xff0c;标志着在大型语言模型&#xff08;LLM&#xff09;领域的一次重大突破&#xff0c;其性能在行业内与GPT-4相媲美。此次更新不仅提升了模型的处理能力和精确性&#xff0c;还将开源模型的性能推向了一个新的高度。 Huggingf…

Docker八股总结

1. 容器和虚拟机的区别 传统虚拟机技术是虚拟出一套硬件后&#xff0c;在其上运行一个完整操作系统&#xff0c;在该系统上再运行所需应用进程&#xff1b;而容器内的应用进程直接运行于宿主的内核&#xff0c;容器内没有自己的内核&#xff0c;而且也没有进行硬件虚拟。因此容…

2021年全国大学生电子设计竞赛D题——基于互联网的摄像测量系统(二)

09 电路设计 前面介绍了系统的硬件框图如下&#xff1a; 硬件基本分为三块&#xff0c;两个摄像节点&#xff0c;一个终端节点。 1. 摄像节点硬件 摄像节点由一个DE10-Nano开发板和一个D8M摄像头实现&#xff0c;DE10-Nano开发板的HDMI接口外接HDMI显示器来显示拍摄到的视频。…

Flask + Bootstrap vs Flask + React/Vue:初学者指南

在这篇博客文章中&#xff0c;我们将比较 Flask Bootstrap 和 Flask React/Vue 这两种技术栈&#xff0c;以帮助初学者了解哪种组合更适合他们的项目需求。我们将从学习曲线、易用性、依赖管理、构建部署和路由定义等方面进行比较。 学习曲线 Flask 是一个基于 Python 的轻…

信息系统项目管理师0055:优化和持续改进(4信息系统管理—4.1管理方法—4.1.5优化和持续改进)

点击查看专栏目录 文章目录 4.1.5优化和持续改进1.定义阶段2.度量阶段3.分析阶段4.改进/设计阶段5.控制/验证阶段4.1.5优化和持续改进 优化和持续改进是信息系统管理活动中的一个环节,良好的优化和持续改进管理活动能够有效保障信息系统的性能和可用性等,延长整体系统的有效使…

偏微分方程算法之一阶双曲差分法

目录 一、研究目标 二、理论推导 2.1 引言 2.2 迎风格式 2.3 完全不稳定差分格式 2.4 蛙跳格式&#xff08;Leapfrog&#xff09; 2.5 Lax-Friedrichs格式 2.6 Lax-Wendroff格式 2.7 Beam-Warming格式 2.8 隐格式 2.9 Courant-Friedrichs-Lewy条件&#xff08;CFL条…

一文学会时序约束

主时钟约束命令/生成时钟约束命令IO输入输出延迟约束命令及效果最大最小延迟命令及作用多周期路径怎么约束什么情况设置伪路径时钟组设置的三个选项 如果不了解时序分析可以先看下下面这篇文章&#xff1a; 数字IC/FPGA——时序分析 目录 1.时钟约束&#xff08;1&#xff09;…

线性代数---行列式的性质

1. 行列式的行与列(按原顺序)互换

redis的数据结构报错

文章目录 redis的数据结构报错Redis使用LocalDateTime报错问题 redis的数据结构报错 Redis使用LocalDateTime报错问题 SpringBoot整合Redis时&#xff0c;使用LocalDate以下报错 org.springframework.data.redis.serializer.SerializationException: Could not read JSON: C…

数字时代安全风险防范与保密科技创新

文章目录 前言一、新技术应用带来的保密挑战1.1 通过技术手段获取国家秘密和重要情报日益普遍1.2 新型信息技术存在的风险不容忽视 二、加强保密科技创新的必要性2.1 提高定密准确性2.2 及时变更密级或解密2.3 对失泄密事故案件进行自动高效的预警和初步处理 三、保密科技创新中…

Jenkins机器已经安装了ansible, 运行的时候却报错ansible: command not found

操作系统&#xff1a;MacOS Jenkins log提示 ansible: command not found 直接在Jenkins 机器中&#xff0c;进入一样的目录执行ansible --version OK 原因&#xff1a; Jenkins 默认使用的环境是 /usr/bin, 而我的ansible 安装配置在conda3 下面&#xff0c;所以需要在Jenkin…

OpenCV从入门到精通实战(四)——答题卡识别判卷系统

基于OpenCV的答题卡识别系统&#xff0c;其主要功能是自动读取并评分答题卡上的选择题答案。系统通过图像处理和计算机视觉技术&#xff0c;自动化地完成了从读取图像到输出成绩的整个流程。下面是该系统的主要步骤和实现细节的概述&#xff1a; 1. 导入必要的库 系统首先导入…