算法通关村第9关【白银】| 二分查找与搜索树高频问题

基于二分查找的拓展问题

1.山脉数组的峰顶索引

思路:二分查找

山峰有三种状态:需要注意数组边界

1.顶峰:arr[mid]>arr[mid+1]&&arr[mid]>arr[mid-1]

2.上坡:arr[mid]<arr[mid+1]

3.下坡:arr[mid] < arr[mid-1]

class Solution {public int peakIndexInMountainArray(int[] arr) {int left = 0;int right = arr.length-1;while(left<=right){int mid = left + ((right - left)>>1);if(mid == 0 && mid == arr.length-1){return -1;}if(arr[mid]>arr[mid+1]&&arr[mid]>arr[mid-1]){return mid;}else if(arr[mid]<arr[mid+1]){left = mid + 1;}else if(arr[mid] < arr[mid-1]){right = mid - 1;}}return -1;}
}

2.寻找旋转排序数组中的最小值

 思路:抓住目标值nums[mid]一定是小于等于nums[high]

class Solution {public int findMin(int[] nums) {int l = 0;int r = nums.length - 1;int mid = 0;while(l<r){mid = l + ((r-l)>>1);if(nums[mid]>=nums[r]){l = mid + 1;}else if(nums[mid]<nums[r]){r = mid;}}return nums[l];}
}

3.寻找旋转排序数组中的最小值II

思路:

本题含有重复的元素

[1,3,3]这种情况,就不能单纯的判断nums[mid]>=nums[high]就舍弃当前mid左区间

但是还是抓住nums[mid]一定是小于等于nums[high]关键,也就是一定在high左边

当nums[mid]==nums[high],high--缩小范围

class Solution {public int findMin(int[] nums) {int l = 0;int r = nums.length - 1;int mid = 0;while(l<r){mid = l + ((r-l)>>1);if(nums[mid]>nums[r]){l = mid + 1;}else if(nums[mid]<nums[r]){r = mid;}else{r -= 1;}}return nums[l];}
}

 4.缺失的数字

思路: 二分查找思路,递增数组

一般情况nums[mid]==mid说明缺失值在mid右侧

nums[mid]>mid,说明缺失值在mid左侧

class Solution {public int missingNumber(int[] nums) {int low = 0;int high = nums.length - 1;while(low<=high){int mid = low + ((high - low)>>1);if(nums[mid]>mid){high = mid-1;}else if(nums[mid]==mid){low = mid+1;}}return low;}
}

5.x的平方根

思路:二分思想,需要注意超过int范围的情况不能直接乘

class Solution {public int mySqrt(int x) {if(x <= 1){return x;}int low = 0;int high = x;while(low<high){int mid = low + ((high - low)>>1);if(x/mid == mid){return mid;}else if(x/mid<mid){high = mid;}else{low = mid+1;}}return low-1;}
}

中序和搜索树

二叉搜索树:左结点小于根结点,右结点大于根结点

二叉搜索树的中序遍历从小到大递增

1.二叉搜索树中的搜索

思路:很简单,与根结点比较,小于往左大于往右,等于返回 。

二叉树递归方法参考二叉树经典算法题

按照递归三部曲写出递归函数,迭代也是可以的。

class Solution {public TreeNode searchBST(TreeNode root, int val) {if(root == null){return null;}if(root.val > val){return searchBST(root.left,val);}if(root.val < val){return searchBST(root.right,val);}return root;}
}

2.验证二叉搜索树

思路:利用搜索树中序遍历递增的特性,如果出现小于前一个值的情况就返回false

class Solution {long pre = Long.MIN_VALUE;public boolean isValidBST(TreeNode root) {if(root == null){return true;}boolean left = isValidBST(root.left);if(root.val<=pre){return false;}pre = root.val;boolean right = isValidBST(root.right);return left&&right;}
}

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

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

相关文章

l8-d6 socket套接字及TCP的实现框架

一、socket套接字 /*创建套接字*/ int socket(int domain, int type, int protocol); /*绑定通信结构体*/ int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen); /*监听套接字*/ int listen(int sockfd, int backlog); /*处理客户端发起的连接&#xff0…

智能合约安全,著名的区块链漏洞:双花攻击

智能合约安全&#xff0c;著名的区块链漏洞&#xff1a;双花攻击 介绍: 区块链技术通过提供去中心化和透明的系统彻底改变了各个行业。但是&#xff0c;与任何技术一样&#xff0c;它也不能免受漏洞的影响。一个值得注意的漏洞是双花攻击。在本文中&#xff0c;我们将深入研究…

【数据结构练习】栈的面试题集锦

目录 前言&#xff1a; 1.进栈过程中可以出栈的选择题 2.将递归转化为循环 3.逆波兰表达式求值 4.有效的括号 5. 栈的压入、弹出序列 6. 最小栈 前言&#xff1a; 数据结构想要学的好&#xff0c;刷题少不了&#xff0c;我们不仅要多刷题&#xff0c;还要刷好题&#x…

16-MyCat

一 Mycat概述 1 什么是Mycat 什么是Mycat Mycat是数据库中间件&#xff0c;所谓数据库中间件是连接Java应用程序和数据库中间的软件。 为什么要用Mycat 遇到问题&#xff1a; Java与数据库的紧耦合高访问量高并发对数据库的压力读写请求数据不一致 2 Mycat与其他中间件区别 目…

【USRP】调制解调系列6:16APSK、32APSK 、基于labview的实现

APSK APSK是&#xff0c;与传统方型星座QAM&#xff08;如16QAM、64QAM&#xff09;相比&#xff0c;其分布呈中心向外沿半径发散&#xff0c;所以又名星型QAM。与QAM相比&#xff0c;APSK便于实现变速率调制&#xff0c;因而很适合目前根据信道及业务需要分级传输的情况。当然…

分布式环境下的数据同步

一般而言elasticsearch负责搜索&#xff08;查询&#xff09;&#xff0c;而sql数据负责记录&#xff08;增删改&#xff09;&#xff0c;elasticsearch中的数据来自于sql数据库&#xff0c;因此sql数据发生改变时&#xff0c;elasticsearch也必须跟着改变&#xff0c;这个就是…

jmeter调试错误大全

一、前言 在使用jmeter做接口测试的过程中大家是不是经常会遇到很多问题&#xff0c;但是无从下手&#xff0c;不知道从哪里开始找起&#xff0c;对于初学者而言这是一个非常头痛的事情。这里结合笔者的经验&#xff0c;总结出以下方法。 二、通过查看运行日志调试问题 写好…

STM32存储左右互搏 I2C总线读写FRAM MB85RC16

STM32存储左右互搏 I2C总线读写FRAM MB85RC16 在较低容量存储领域&#xff0c;除了EEPROM的使用&#xff0c;还有铁电存储器FRAM的使用&#xff0c;相对于EEPROM, 同样是非易失性存储单元&#xff0c;FRAM支持更高的访问速度&#xff0c; 其主要优点为没有EEPROM持续写操作跨页…

Python虚拟环境venv下安装playwright介绍及记录

playwright介绍 Playwright是一个用于自动化Web浏览器测试和Web数据抓取的开源库。它由Microsoft开发&#xff0c;支持Chrome、Firefox、Safari、Edge和WebKit浏览器。Playwright的一个主要特点是它能够在所有主要的操作系统&#xff08;包括Windows、Linux和macOS&#xff09…

计算机毕设 大数据商城人流数据分析与可视化 - python 大数据分析

文章目录 0 前言课题背景分析方法与过程初步分析&#xff1a;总体流程&#xff1a;1.数据探索分析2.数据预处理3.构建模型 总结 最后 0 前言 &#x1f525; 这两年开始毕业设计和毕业答辩的要求和难度不断提升&#xff0c;传统的毕设题目缺少创新和亮点&#xff0c;往往达不到…

SMU200A/罗德与施瓦茨SMU200A信号发生器

181/2461/8938产品概述 R&S SMU200A信号发生器旨在满足现代通信系统研发及其生产中遇到的所有要求。R&S SMU200A矢量信号发生器不仅将多达两个独立的信号发生器组合在一个只有四个高度单位的机柜中&#xff0c;还提供无与伦比的RF和基带特性。 Rohde & Schwarz S…

Vue3数值动画(NumberAnimation)

效果如下图&#xff1a;在线预览 APIs 参数说明类型默认值必传from数值动画起始数值number0falseto数值目标值number1000falseduration数值动画持续时间&#xff0c;单位msnumber3000falseautoplay是否自动开始动画booleantruefalseprecision精度&#xff0c;保留小数点后几位…

NineData 中标移动云数据库传输项目

导读近日&#xff0c;玖章算术 NineData 智能数据管理平台成功中标《2023 年移动云数据库传输服务软件项目》&#xff0c;中标金额为 406 万。这标志着玖章算术 NineData 平台已成功落地顶级运营商行业&#xff0c;并在数据管理方面实现了大规模应用实践。 NineData 中标 2023 …

SQLite简单介绍

一.简单介绍 SQLite是一款轻型的数据库&#xff0c;是遵守ACID的关系型数据库管理系统&#xff0c;它包含在一个相对小的C库中。它是D.RichardHipp建立的公有领域项目。它的设计目标是嵌入式的&#xff0c;而且已经在很多嵌入式产品中使用了它&#xff0c;它占用资源非常的低&…

音频基础知识

文章目录 前言一、音频基本概念1、音频的基本概念①、声音的三要素②、音量与音调③、几个基本概念④、奈奎斯特采样定律 2、数字音频①、采样②、量化③、编码④、其他相关概念<1>、采样位数<2>、通道数<3>、音频帧<4>、比特率&#xff08;码率&#…

02-Flask-对象初始化参数

对象初始化参数 前言对象初始化参数import_namestatic_url_pathstatic_foldertemplate_floder 前言 本篇来学习Flask中对象初始化参数 对象初始化参数 import_name Flask程序所在的包(模块)&#xff0c;传__name__就可以 _name_ 是一个标识 Python 模块的名字的变量&#x…

2023_Spark_实验六:Scala面向对象部分演示(二)(IDEA开发)

7、Scala中的apply方法&#xff08;&#xff09; 遇到如下形式的表达式时&#xff0c;apply方法就会被调用&#xff1a; Object(参数1,参数2,......,参数N) 通常&#xff0c;这样一个apply方法返回的是伴生类的对象&#xff1b;其作用是为了省略new关键字 Object的apply方法…

MATLAB旋转动图的绘制

MATLAB旋转动图的绘制 文章目录 MATLAB旋转动图的绘制1、动图效果2、matlab代码 利用matlab实现三维旋转动图的绘制。 1、动图效果 2、matlab代码 close all clear clcf(x,y,z)(x.^2 (9./4).*y.^2 z.^2 - 1).^3 - x.^2.*z.^3 - (9./80).*y.^2.*z.^3; [x,y,z]meshgrid(linspac…

linux并发服务器 —— linux网络编程(七)

网络结构模式 C/S结构 - 客户机/服务器&#xff1b;采用两层结构&#xff0c;服务器负责数据的管理&#xff0c;客户机负责完成与用户的交互&#xff1b;C/S结构中&#xff0c;服务器 - 后台服务&#xff0c;客户机 - 前台功能&#xff1b; 优点 1. 充分发挥客户端PC处理能力…

RK开发板的USB连接(Ubuntu)

一、安装连接工具 sudo apt-get install putty 二、启动putty工具 sudo putty 三、连接usb&#xff0c;并查看相关的信息 # 查看接入的是否有usb ls /dev/tty* 显示如下&#xff1a;&#xff08;含有usb接口&#xff1a; /dev/ttyUSB0&#xff09; /dev/tty /dev/tty23 /d…