二分法问题

 日升时奋斗,日落时自省

目录

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+1if(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等于相等情况的下标 midright=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等于相等情况的下标 midleft=mid;}}//left==right 此时  所以返回right也可以return left;}

2、二分法问题

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

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

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

代码:

    public int[] searchRange(int[] nums, int target) {//题目说了要两个 下标 咱们建立一个数组来放置int[] ret=new int[2];//例题已经给了 要求为空 数组返回 -1 -1if(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 -1return 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.hqwc.cn/news/630838.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【运输层】TCP 的流量控制和拥塞控制

目录 1、流量控制 2、TCP 的拥塞控制 &#xff08;1&#xff09;拥塞控制的原理 &#xff08;2&#xff09;拥塞控制的具体方法 1、流量控制 一般说来&#xff0c;我们总是希望数据传输得更快一些。但如果发送方把数据发送得过快&#xff0c;接收方就可能来不及接收&#x…

java项目的构建工具-Maven

黑马程序员JavaWeb开发教程 文章目录 一、概述1、介绍&#xff08;1&#xff09;介绍&#xff08;2&#xff09;Maven的作用&#xff08;3&#xff09;官网&#xff08;4&#xff09;仓库 2、安装 二、IDEA 集成 Maven1、配置Maven环境2、创建Maven项目&#xff08;1&#xff0…

万字总结!Docker简介及底层关键技术剖析

本文首发在个人博客上&#xff1a;万字总结&#xff01;Docker简介及底层关键技术剖析 Docker 简介 Docker 是一个开源的应用容器引擎&#xff0c;基于 Go 语言 并遵从 Apache2.0 协议开源。Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中&#x…

钉钉直播回放怎么下载到本地

钉钉直播回放如何下载到本地,本文就给大家解密如何下载到本地 工具我已经给大家打包好了 钉钉直播回放下载软件链接&#xff1a;https://pan.baidu.com/s/1_4NZLfENDxswI2ANsQVvpw?pwd1234 提取码&#xff1a;1234 --来自百度网盘超级会员V10的分享 1.首先解压好我给大家…

后端-MySQL-week11 多表查询

tips: distinct————紧跟“select”之后&#xff0c;用于去重 多表查询 概述 一对多&#xff08;多对一&#xff09; 多对多 一对一 多表查询概述 分类 连接查询 内连接 外连接 自连接 必须起别名&#xff01; 联合查询-union&#xff0c;union all 子查询 概念 分类 …

docker部署SpringCloud微服务项目

我们写好的项目&#xff0c;都需要部署上线&#xff0c;今天就给大家介绍一下&#xff0c;如何将微服务项目部署上线&#xff0c;一般我们部署项目都是先在本地docker部署一遍&#xff0c;如果没有问题再部署到服务器&#xff0c;那么今天我就按照这个顺序来说 前置条件 微服…

数学建模--蒙特卡罗法MATLAB代码保姆式解析

1.简单介绍 2.思想的实际运用 我们利用蒙特卡罗法的思想求解圆周率π的值&#xff0c;这里求得的肯定是近似值&#xff0c;我们是通过大量的模拟实验&#xff0c;利用概率求解的&#xff0c;但是这个值和我们的精确值之间还是有一定的误差的&#xff1b; 我们的思想就是在半径为…

axios的封装理解和基本使用

axios的配置 ruoyi的前端对axios进行了封装&#xff0c;让我们发get请求或者是post请求更加方便了。 ruoyi对axios的封装在下面文件中&#xff1a;打开文件&#xff0c;可以看到它有三个显眼的方法&#xff0c;分别是request拦截器、response拦截器和通用下载方法。ruoYi接口地…

vivo怎么录屏?玩转手机新体验!(2024最新)

“最近新入手了一款vivo手机&#xff0c;感觉用起来真的很顺手&#xff0c;各种功能都很强大。昨天和朋友一起打游戏&#xff0c;突然想到要记录下精彩瞬间&#xff0c;但是找遍了手机&#xff0c;都没有找到录屏功能。我想请教一下各位vivo手机用户&#xff0c;你们通常在哪里…

Golang基础-13

Go语言基础 介绍 并发 channel goroutine 互斥锁 读写锁 原子操作 select 超时处理 sync包 runtime包 介绍 本文介绍Go语言中 channel、goroutine、互斥锁、读写锁、原子操作、select、超时处理、sync包、runtime包等相关知识。 并发 进程是是最小的资源管理单元…

机器视觉【1】-机械臂视觉

文章目录 Eye-to-HandEye-in-Hand基于Eye-in-Hand型机械臂单目视觉定位单目相机标定针孔相机模型畸变标定方法机械臂手眼标定手眼标定求解图像预处理图像灰度化与二值化图像滤波图像特征匹配机械臂单目视觉定位目标物体图像深度信息目标物体中心定位参考文献根据机械臂与相机所…

如何进行开关电源温升极限测试?

开关电源温升极限测试是指开关电源在没有过温保护的条件下&#xff0c;逐渐升高电源的测试温度&#xff0c;直到开关电源损坏。温升极限测试是为了研究开关电源能够承受的最高环境温度&#xff0c;从而评估开关电源的性能&#xff0c;优化提升开关电源的工艺设计。 温升极限测试…