当前位置: 首页 > 编程日记 > 正文

LeetCode刷题-7

数组-108. 将有序数组转换为二叉搜索树

  • 题目描述
    • 题目样例
  • 前言
  • Java方法:中序遍历,总是选择中间位置左边的数字作为根节点
    • 思路及算法
    • 代码
    • 复杂度
  • Java方法:中序遍历,总是选择中间位置右边的数字作为根节点
    • 思路及算法
    • 代码
    • 复杂度
  • Java方法:中序遍历,选择任意一个中间位置数字作为根节点
    • 思路及算法
    • 代码
    • 复杂度

题目描述

给你一个整数数组 nums ,其中元素已经按升序排列,请你将其转换为一棵高度平衡二叉搜索树。高度平衡二叉树是一棵满足每个节点的左右两个子树的高度差的绝对值不超过 1的二叉树。

题目样例

  • 示例1:
    在这里插入图片描述
输入:nums = [-10,-3,0,5,9]
输出:[0,-3,9,-10,null,5]
解释:[0,-10,5,null,-3,null,9] 也将被视为正确答案:

在这里插入图片描述

  • 示例2:
    在这里插入图片描述
输入:nums = [1,3]
输出:[3,1]
解释:[1,3][3,1] 都是高度平衡二叉搜索树。
  • 提示:
1 <= nums.length <= 10^4
-10^4 <= nums[i] <= 10^4
nums 按严格递增顺序排列

前言

二叉搜索树的中序遍历是升序序列,题目给定的数组是按照升序排序的有序数组,因此可以确保数组是二叉搜索树的中序遍历序列。
给定二叉搜索树的中序遍历,是否可以唯一地确定二叉搜索树?答案是否定的。如果没有要求二叉搜索树的高度平衡,则任何一个数字都可以作为二叉搜索树的根节点,因此可能的二叉搜索树有多个。
在这里插入图片描述
如果增加一个限制条件,即要求二叉搜索树的高度平衡,是否可以唯一地确定二叉搜索树?答案仍然是否定的。
在这里插入图片描述
直观地看,我们可以选择中间数字作为二叉搜索树的根节点,这样分给左右子树的数字个数相同或只相差 11,可以使得树保持平衡。如果数组长度是奇数,则根节点的选择是唯一的,如果数组长度是偶数,则可以选择中间位置左边的数字作为根节点或者选择中间位置右边的数字作为根节点,选择不同的数字作为根节点则创建的平衡二叉搜索树也是不同的。
在这里插入图片描述
确定平衡二叉搜索树的根节点之后,其余的数字分别位于平衡二叉搜索树的左子树和右子树中,左子树和右子树分别也是平衡二叉搜索树,因此可以通过递归的方式创建平衡二叉搜索树。
递归的基准情形是平衡二叉搜索树不包含任何数字,此时平衡二叉搜索树为空。在给定中序遍历序列数组的情况下,每一个子树中的数字在数组中一定是连续的,因此可以通过数组下标范围确定子树包含的数字,下标范围记为 [left,right]。对于整个中序遍历序列,下标范围从left=0 到right=nums.length−1。当 left>right 时,平衡二叉搜索树为空。
以下三种方法中,方法一总是选择中间位置左边的数字作为根节点,方法二总是选择中间位置右边的数字作为根节点,方法三是方法一和方法二的结合,选择任意一个中间位置数字作为根节点。

Java方法:中序遍历,总是选择中间位置左边的数字作为根节点

思路及算法

选择中间位置左边的数字作为根节点,则根节点的下标为mid=(left+right)/2,此处的除法为整数除法。在这里插入图片描述

代码

class Solution {public TreeNode sortedArrayToBST(int[] nums) {return helper(nums, 0, nums.length - 1);}public TreeNode helper(int[] nums, int left, int right) {if (left > right) {return null;}// 总是选择中间位置左边的数字作为根节点int mid = (left + right) / 2;TreeNode root = new TreeNode(nums[mid]);root.left = helper(nums, left, mid - 1);root.right = helper(nums, mid + 1, right);return root;}
}

复杂度

  • 时间复杂度:O(n),其中 n 是数组的长度。每个数字只访问一次。
  • 空间复杂度:O(logn),其中 n 是数组的长度。空间复杂度不考虑返回值,因此空间复杂度主要取决于递归栈的深度,递归栈的深度是 O(logn)。

Java方法:中序遍历,总是选择中间位置右边的数字作为根节点

思路及算法

选择中间位置右边的数字作为根节点,则根节点的下标为 mid=(left+right+1)/2,此处的除法为整数除法。

代码

class Solution {public TreeNode sortedArrayToBST(int[] nums) {return helper(nums, 0, nums.length - 1);}public TreeNode helper(int[] nums, int left, int right) {if (left > right) {return null;}// 总是选择中间位置右边的数字作为根节点int mid = (left + right + 1) / 2;TreeNode root = new TreeNode(nums[mid]);root.left = helper(nums, left, mid - 1);root.right = helper(nums, mid + 1, right);return root;}
}

复杂度

  • 时间复杂度:O(n),其中 n 是数组的长度。每个数字只访问一次。
  • 空间复杂度:O(logn),其中 n 是数组的长度。空间复杂度不考虑返回值,因此空间复杂度主要取决于递归栈的深度,递归栈的深度是 O(logn)。

Java方法:中序遍历,选择任意一个中间位置数字作为根节点

思路及算法

选择任意一个中间位置数字作为根节点,则根节点的下标为mid=(left+right)/2 和mid=(left+right+1)/2 两者中随机选择一个,此处的除法为整数除法。在这里插入图片描述

代码

class Solution {Random rand = new Random();public TreeNode sortedArrayToBST(int[] nums) {return helper(nums, 0, nums.length - 1);}public TreeNode helper(int[] nums, int left, int right) {if (left > right) {return null;}// 选择任意一个中间位置数字作为根节点int mid = (left + right + rand.nextInt(2)) / 2;TreeNode root = new TreeNode(nums[mid]);root.left = helper(nums, left, mid - 1);root.right = helper(nums, mid + 1, right);return root;}
}

复杂度

  • 时间复杂度:O(n),其中 n 是数组的长度。每个数字只访问一次。
  • 空间复杂度:O(logn),其中 n 是数组的长度。空间复杂度不考虑返回值,因此空间复杂度主要取决于递归栈的深度,递归栈的深度是 O(logn)。
    [1]:https://leetcode-cn.com/problems/convert-sorted-array-to-binary-search-tree/solution/jiang-you-xu-shu-zu-zhuan-huan-wei-er-cha-sou-s-33/

相关文章:

PS 拉伸大长腿

1.打开一个图片工具栏--图像--画布大小 2.选择矩形选框工具--框住要拉升退的位置--然后在按CtrlT&#xff0c;进行拉伸即可 转载于:https://www.cnblogs.com/dengqing9393/p/9481647.html

LeetCode刷题-8

数组-118. 杨辉三角题目描述题目样例Java方法&#xff1a;数学思路及算法代码复杂度题目描述 给定一个非负整数 numRows&#xff0c;生成「杨辉三角」的前 numRows 行。 在「杨辉三角」中&#xff0c;每个数是它左上方和右上方的数的和。 题目样例 示例1&#xff1a; 输入…

php导出excel格式数据

解决2个问题&#xff1a; 1.身份证之类的文本数据自动转为科学计数法的问题。 2.中文乱码的问题 excel从web页面上导出的原理。当我们把这些数据发送到客户端时&#xff0c;我们想让客户端程序&#xff08;浏览器&#xff09;以excel的格式读取 它&#xff0c;所以把mime类型设…

[BZOJ2796][Poi2012]Fibonacci Representation

由于是斐波那契数列&#xff0c;所以$x_ix_j<x_k,i<j<k$ 所以猜测可以贪心选择两边近的数处理。 1 #include<cstdio>2 #include<algorithm>3 #define ll long long4 #define mid (lr>>1)5 using namespace std;6 ll f[505],tot1;7 inline ll findl(…

AppStore审核2.1被拒大礼包过审经历

本团队的iOS端迭代至今&#xff0c;经历过AppStore审核的数次调整&#xff0c;包括审核时长、严厉程度等&#xff0c;尝过各种花式的拒绝理由&#xff0c;但从没有像2018年初这次来得猛烈和漫长。从首次提交到最后过审几乎花费一个月的时间&#xff0c;下面的文字记录了整个过程…

oracle 小数点前零丢失的问题

1.问题起源 oracle 数据库字段值为小于1的小数时&#xff0c;使用char类型处理&#xff0c;会丢失小数点前面的0 例如0.35就变成了.352.解决办法:用to_char函数格式化数字显示 select to_char(0.338,fm9999999990.00) from dual; 结果:0.34 这里重点…

SQLServer查看存储过程的方法

使用 sp_helptext 查看存储过程的定义 在对象资源管理器中&#xff0c;连接到 数据库引擎实例&#xff0c;再展开该实例。在工具栏上&#xff0c;单击“新建查询”。在查询窗口中&#xff0c;输入下列语句。更改数据库名称和存储过程名称以引用所需的数据库和存储过程。USE yca…

数据文件u11

数组-136. 只出现一次的数字题目描述题目样例Java方法&#xff1a;位运算算法思路代码复杂度题目描述 给定一个非空整数数组&#xff0c;除了某个元素只出现一次以外&#xff0c;其余每个元素均出现两次。找出那个只出现了一次的元素。 题目样例 示例1&#xff1a; 输入: […

centos7安装配置pgAgent

centos7安装pgagent&#xff1a;默认cmake已经安装编译wxGTKhttps://excellmedia.dl.sourceforge.net/project/wxwindows/2.8.7/wxGTK-2.8.7.tar.gz# yum install gcc gcc-c# tar -zxf wxGTK-2.8.7.tar.gz# cd wxGTK-2.8.7[wxGTK-2.8.7]# vi /etc/profileexport PGHOME/usr/loc…

Oracle-ORA-01722 invalid number错误

本来正常的&#xff0c;经过抓包才知道原来是数字型的无意中多了乱码&#xff01; 本来是3276的居然多了后面一串 3276PuAnrSeU2zliUIV/FHlnX2Xgia1au2xX2vMWtwhttp://www.cnblogs.com/raymond19840709/archive/2008/05/16/1200826.html 1. 代码里面执行了如下SQL语句&#xff…

只读方式VS地址

数组-136. 只出现一次的数字题目描述题目样例Java方法&#xff1a;位运算算法思路代码复杂度题目描述 给定一个非空整数数组&#xff0c;除了某个元素只出现一次以外&#xff0c;其余每个元素均出现两次。找出那个只出现了一次的元素。 题目样例 示例1&#xff1a; 输入: […

Nmap (网络映射器)好东西啊

2019独角兽企业重金招聘Python工程师标准>>> Nmap &#xff08;网络映射器&#xff09;是由 Gordon Lyon设计&#xff0c;用来探测计算机网络上的主机和服务的一种安全扫描器。为了绘制网络拓扑图&#xff0c;Nmap的发送特制的数据包到目标主机&#xff0c;然后对返…

【教你赚钱】独立开发者荒野求生之道

本文包括以下内容&#xff1a; 独立开发者面临的现状如何利用一切细节&#xff0c;获取流量注&#xff1a;本文将不涉及代码层面的东西&#xff0c;但是将有可能帮助你&#xff0c;把你写完的代码的价值&#xff0c;放大十倍百倍千倍。 我做了四年独立开发&#xff0c;从一开始…

form表单的reset

form表单的reset重置表单(把表单的所有输入元素重置为它们的默认值。):1.使用reset按钮&#xff0c;条件reset按钮必须在form表单内部。2. <input id"Button1" type"button" value"button" οnclick"form1.reset();" />可以不在…

导航属性(外键)

第一种方法:(不灵活)1.一个学生类型只能保存一个年级对象//一个年级对象能保存多个学生对象//实际开发时单向比较多5.在年级对象类中根据年级编号来查询年级对象//写在if前面代表察回来值即使是空也没问题 因为null6.创建学生编号的时候new 一个 年级对象并且调用年级对象的id将…

23.week4

调通了 剩下的就是核心的部分 转载于:https://www.cnblogs.com/PoeticalJustice/p/9494823.html

“重置”不是“清空”

编程这么多年&#xff0c;一直以为“重置”按钮就是“清空”。 其实&#xff0c;重置是让页面回到初始状态&#xff0c;关键就是如果某个文本框中有值&#xff0c;那么点重置是不能清空的。可以自己做个测试&#xff0c;在一开始就有值的文本框后添加信息&#xff0c;点重置只会…

洒出VS的受调查

数组-136. 只出现一次的数字题目描述题目样例Java方法&#xff1a;位运算算法思路代码复杂度题目描述 给定一个非空整数数组&#xff0c;除了某个元素只出现一次以外&#xff0c;其余每个元素均出现两次。找出那个只出现了一次的元素。 题目样例 示例1&#xff1a; 输入: […

SQL 常用方法

SQL 常用方法 EXCEPT &#xff1a;返回两个结果集的差&#xff08;即从左查询中返回右查询没有找到的所有非重复值&#xff09;。 INTERSECT &#xff1a;返回 两个结果集的交集&#xff08;即两个查询都返回的所有非重复值&#xff09;。 UNION &#xff1a;返回两个结果集的并…

【转】Visual Studio团队资源管理器 Git 源码管理工具简单入门

1.1 环境 Visual Studio GitLab (其他版本同理) 1.2 Git操作过程图解 1.3 常见名词解释 拉取&#xff08;Pull&#xff09;&#xff1a;将远程版本库合并到本地版本库&#xff0c;相当于&#xff08;FetchMeger&#xff09; 获取&#xff08;Fetch&#xff09;&#xff1a;从远…

php字符串比较函数

比较两个字符串是否相等&#xff0c;最常见的方法就是使用“”来判断&#xff0c;至于它和“”的区别&#xff0c;简单来说就是前者强调“identical”类型也要求一样&#xff1b;后者要求“equal”&#xff0c;值相同就可以了&#xff0c;参考【1】。或者使用strcmp来判断&…

Debugging Tools for Windows__from WDK7

1、 主要要用到两个工具&#xff1a; (1)、WinDBG 这个主要用于 非IDE下 调试程序/查看信息等 (2)、cdb.exe 这个主要是用在 Qt5.3.2 for VS10 的单步调试器 2、 WDK7 的文件&#xff0c;名为 GRMWDK_EN_7600_1.ISO&#xff0c;该文件我备份于“百度云 CodeSkill --> 全部文…

数据结构:二分查找 java

为什么80%的码农都做不了架构师&#xff1f;>>> 二分查找的前提是有序存储&#xff0c;利用顺序存储和元素排序 /*** 二分查找&#xff0c;查找成功&#xff0c;返回下标记* param values* param begin* param end* param key* param <T>* return*/ public s…

PHP一些十分严重的缺陷

1. 对递归的不良支持 递归是一种函数调用自身的机制。这是一种强大的特性可以把某些复杂的东西变得很简单。有一个使用递归的例子是快速排序(quicksort)。不幸的是&#xff0c;PHP并不擅长递归。Zeev&#xff0c;一个PHP开发人员&#xff0c;说道&#xff1a;“PHP 4.0(Zend)对…

Thinkphp----------为什么Thinkphp会默认进入Index控制器的index方法

1、最近遇到两个刚学PHP的童鞋&#xff0c;都问到了同一个问题&#xff0c;就是他们没有做什么配置&#xff0c;为什么访问入口文件index.php的时候会自动跳转到IndexController里面的index方法。他们想知道具体怎么回事&#xff0c;下面就简单讲解一下&#xff0c;其实并不难只…

Confluence 6 Home 和其他重要的目录

2019独角兽企业重金招聘Python工程师标准>>> Confluence 安装目录 Confluence 安装的目录&#xff08;Confluence Installation directory&#xff09;定义的是 Confluence 是在那里进行安装的。这个目录有时候也被称为 Confluence 安装目录&#xff08;Confluence …

Apache,Nginx,Lighttpd分别使用X-sendfile功能提升文件下载性能

关于mod_xsendfile https://tn123.org/mod_xsendfile/Lighttpd中的X-sendfile RoR网站如何利用lighttpd的X-sendfile功能提升文件下载性能 使用X-sendfile方式&#xff0c;服务器端应用程序不需要读取下载文件了&#xff0c;只需要设置response的header信息就足够了&#xff0c…

[译] ASP.NET 生命周期 – ASP.NET 上下文对象(六)

使用 HttpApplication 对象 ASP.NET 框架中的许多类都提供了许多很方便的属性可以直接映射到 HttpContext 类中定义的属性。这种交叠有一个很好的例子就是 HttpApplication&#xff0c;它就是全局应用类的基类&#xff0c;在下表中&#xff0c;你可以看到 HttpApplication 类中…

变得非常不vb

数组-136. 只出现一次的数字题目描述题目样例Java方法&#xff1a;位运算算法思路代码复杂度题目描述 给定一个非空整数数组&#xff0c;除了某个元素只出现一次以外&#xff0c;其余每个元素均出现两次。找出那个只出现了一次的元素。 题目样例 示例1&#xff1a; 输入: […

分析PHP中单双引号的误区和双引号小隐患

2019独角兽企业重金招聘Python工程师标准>>> 1、一般情况下两者是通用的.但如果双引号内写的是变量就会执行解析操作,而单引号则不解析&#xff0c;这个怎么说&#xff1f;还是举个例子吧。 这下看明白了吧&#xff01; 2、执行效率不一样&#xff0c;单引号的执行速…