Python算法题集_将有序数组转换为二叉搜索树

 Python算法题集_将有序数组转换为二叉搜索树

  • 题108:将有序数组转换为二叉搜索树
  • 1. 示例说明
  • 2. 题目解析
    • - 题意分解
    • - 优化思路
    • - 测量工具
  • 3. 代码展开
    • 1) 标准求解【极简代码递归】
    • 2) 改进版一【多行代码递归】
    • 3) 改进版二【极简代码递归+传递下标】
  • 4. 最优算法

本文为Python算法题集之一的代码示例

题108:将有序数组转换为二叉搜索树

1. 示例说明

给你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵 高度平衡 二叉搜索树。

高度平衡 二叉树是一棵满足「每个节点的左右两个子树的高度差的绝对值不超过 1 」的二叉树。

示例 1:

在这里插入图片描述

输入:nums = [-10,-3,0,5,9]
输出:[0,-3,9,-10,null,5]
解释:[0,-10,5,null,-3,null,9] 也将被视为正确答案:

示例 2:

img

输入:nums = [1,3]
输出:[3,1]
解释:[1,null,3] 和 [3,1] 都是高度平衡二叉搜索树。

提示:

  • 1 <= nums.length <= 104
  • -104 <= nums[i] <= 104
  • nums严格递增 顺序排列

2. 题目解析

- 题意分解

  1. 本题为将有序数组生成平衡二叉搜索树
  2. 基本的基本思路是深度优先算法【DFS(Depth-First Search)】,生成一个中序遍历有序的二叉树

- 优化思路

  1. 通常优化:减少循环层次

  2. 通常优化:增加分支,减少计算集

  3. 通常优化:采用内置算法来提升计算速度

  4. 分析题目特点,分析最优解

    1. 可以在递归过程减少传递值的规模

- 测量工具

  • 本地化测试说明:LeetCode网站测试运行时数据波动很大,因此需要本地化测试解决这个问题
  • CheckFuncPerf(本地化函数用时和内存占用测试模块)已上传到CSDN,地址:Python算法题集_检测函数用时和内存占用的模块
  • 本题本地化超时测试用例自己生成,详见【最优算法章节】

3. 代码展开

1) 标准求解【极简代码递归】

将递归主要代码写在一行内,加上判断语句,只用3句

马马虎虎,超过75%在这里插入图片描述

import CheckFuncPerf as cfpclass Solution:def sortedArrayToBST_base(self, nums):ilen = len(nums)if ilen == 0: return Nonereturn TreeNode(nums[ilen // 2], self.sortedArrayToBST_base(nums[0: (ilen // 2)]), self.sortedArrayToBST_base(nums[(ilen // 2) + 1:]))result = cfp.getTimeMemoryStr(Solution.sortedArrayToBST_base, aSolution, nums)
print(result['msg'], '执行结果 = {}'.format(result['result'].val))# 运行结果
函数 sortedArrayToBST_base 的运行时间为 3176.51 ms;内存使用量为 156856.00 KB 执行结果 = 500000

2) 改进版一【多行代码递归】

将递归代码展开,判断语句就变多了
奇怪的是,这种方式实际性能最低,但是网站上运行居然效果最好,可能是计算量太小,导致波动掩盖了效率

性能卓越,超越95%在这里插入图片描述

import CheckFuncPerf as cfpclass Solution:def sortedArrayToBST_ext1(self, nums):if not nums:returnimid = len(nums) // 2root = TreeNode(nums[imid])if imid == 0:  return rootroot.left = self.sortedArrayToBST_ext1(nums[:imid])root.right = self.sortedArrayToBST_ext1(nums[imid + 1:])return rootresult = cfp.getTimeMemoryStr(Solution.sortedArrayToBST_ext1, aSolution, nums)
print(result['msg'], '执行结果 = {}'.format(result['result'].val))# 运行结果
函数 sortedArrayToBST_ext1 的运行时间为 3500.60 ms;内存使用量为 156944.00 KB 执行结果 = 500000

3) 改进版二【极简代码递归+传递下标】

将递归主要代码写在一行内,另外前两种传递参数为列表切片,修改为传递左右下标,减少了切片操作

马马虎虎,超过69%在这里插入图片描述

import CheckFuncPerf as cfpclass Solution:def sortedArrayToBST_ext2(self, nums):def sortedarraytobst(left, right):if left > right: return Noneimid = (left + right) // 2return TreeNode(nums[imid], sortedarraytobst(left, imid-1),sortedarraytobst(imid+1, right))return sortedarraytobst(0, len(nums)-1)result = cfp.getTimeMemoryStr(Solution.sortedArrayToBST_ext2, aSolution, nums)
print(result['msg'], '执行结果 = {}'.format(result['result'].val))# 运行结果
函数 sortedArrayToBST_ext2 的运行时间为 2529.24 ms;内存使用量为 154624.00 KB 执行结果 = 499999

4. 最优算法

根据本地日志分析,最优算法为第3种方式【极简代码递归+传递下标】sortedArrayToBST_ext2

iLen = 1000000
nums = [x for x in range(iLen)]
aSolution = Solution()
result = cfp.getTimeMemoryStr(Solution.sortedArrayToBST_base, aSolution, nums)
print(result['msg'], '执行结果 = {}'.format(result['result'].val))
result = cfp.getTimeMemoryStr(Solution.sortedArrayToBST_ext1, aSolution, nums)
print(result['msg'], '执行结果 = {}'.format(result['result'].val))
result = cfp.getTimeMemoryStr(Solution.sortedArrayToBST_ext2, aSolution, nums)
print(result['msg'], '执行结果 = {}'.format(result['result'].val))# 算法本地速度实测比较
函数 sortedArrayToBST_base 的运行时间为 3176.51 ms;内存使用量为 156856.00 KB 执行结果 = 500000
函数 sortedArrayToBST_ext1 的运行时间为 3500.60 ms;内存使用量为 156944.00 KB 执行结果 = 500000
函数 sortedArrayToBST_ext2 的运行时间为 2529.24 ms;内存使用量为 154624.00 KB 执行结果 = 499999

一日练,一日功,一日不练十日空

may the odds be ever in your favor ~

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

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

相关文章

备战蓝桥杯---图论之最小生成树

首先&#xff0c;什么是最小生成树&#xff1f; 他就是无向图G中的所有生成树中树枝权值总和最小的。 如何求&#xff1f; 我们不妨采用以下的贪心策略&#xff1a; Prim算法&#xff08;复杂度&#xff1a;&#xff08;nm)logm)&#xff1a; 我们对于把上述的点看成两个集…

NX二次开发树列表双击快速进入编辑状态

先将这几个树列表回调注释给解开 int TreeColumn0;//定义一个全局边量记录点击的那一列NXOpen::BlockStyler::Tree::BeginLabelEditState OnBeginLabelEditCallback(NXOpen::BlockStyler::Tree *tree,NXOpen::BlockStyler::Node *node,int columID) {if(columnIDTreeColumnID)…

无人机基本知识,无人机遥控器功能详解与调试方法

无人机作为一种新兴的飞行器&#xff0c;近年来在各个领域得到了广泛的应用。而无人机遥控器则是控制无人机飞行的重要工具。 无人机遥控器是一种无线设备&#xff0c;通过它来远程控制无人机的飞行。遥控器通常包括一个或多个摇杆&#xff0c;用于控制无人机的各种动作&#x…

QGIS004:【10栅格地形分析工具箱】-坡度、坡向、山体阴影

摘要&#xff1a;QGIS栅格地形分析工具箱常用工具有坡度、坡向、山体阴影等选项&#xff0c;本文介绍各选项的基本操作。 实验数据&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1gYZ_om4AlSdal0bts2mt-A?pwd4rrn 提取码&#xff1a;4rrn 一、坡度 工具功能&…

B端系统从0到1:有几步,其中需求分析要做啥?

一款B系统从无到有都经历了啥&#xff0c;而其中的需求分析又要做什么&#xff1f;贝格前端工场给老铁们做一下分析&#xff0c;文章写作不易&#xff0c;如果咱们有界面设计和前端开发需求&#xff0c;别忘了私信我呦&#xff0c;开始了。 一、B端系统从0到1都有哪些要走的步骤…

Vue练习3:组件开发3(页面切换)

预览 ——————————————————————————————————————————— 组件文档 Pager组件 属性 属性名含义类型必填默认值current当前页码&#xff08;总数据量/单页容量&#xff09;Number否1total总数据量Number否0limit单页容量Number否10vis…

Day-02-01

内容管理模块项目开发 Swagger的使用 1. 导入依赖 <!-- Spring Boot 集成 swagger --> <dependency><groupId>com.spring4all</groupId><artifactId>swagger-spring-boot-starter</artifactId> </dependency> 2. 配置信息 # 在app…

为何重复造轮子

重复造轮子&#xff0c;意思是说&#xff0c;一个项目本身存在开源组件&#xff0c;但开发团队还是选择重新手写一套组件库或框架的情况&#xff0c;这在软件业界比比皆是。 下面说下游戏项目里重复造轮子的几点原因。 一&#xff0c;精简化 一般开源项目为了适应多场景多业…

【制作100个unity游戏之25】3D背包、库存、制作、快捷栏、存储系统、砍伐树木获取资源、随机战利品宝箱2(附带项目源码)

效果演示 文章目录 效果演示系列目录前言拖放、交换物品绘制拖拽物品插槽UI修改Inventory&#xff0c;控制拖放功能 源码完结 系列目录 前言 欢迎来到【制作100个Unity游戏】系列&#xff01;本系列将引导您一步步学习如何使用Unity开发各种类型的游戏。在这第25篇中&#xf…

什么原因导致百度百科建立一直审核不通过?

百科词条对网络营销实在是太重要了&#xff0c;不管是个人还是企业想在网上开展业务&#xff0c;都必要建立百科词条。自己动手编辑百科词条&#xff0c;搞个几十次也审核不过的情况比比皆是。 为什么百度百科总是审核不通过&#xff1f;百度官方发表过声明表示百度百科词条是人…

【JS逆向+Python模拟API请求】逆向某一个略微中等的混淆网站,并模拟调用api请求 仅供学习。注:不是源代码混淆,而是一个做代码混淆业务的网站,

逆向日期&#xff1a;2024.02.16 使用工具&#xff1a;Node.js 加密方法&#xff1a;RSA标准库 文章全程已做去敏处理&#xff01;&#xff01;&#xff01; 【需要做的可联系我】 AES解密处理&#xff08;直接解密即可&#xff09;&#xff08;crypto-js.js 标准算法&#xf…

ubuntu22.04安装jenkins并配置

准备 更新系统 sudo apt update sudo apt upgrade环境准备 jdk 安装 sudo apt install openjdk-11-jdk验证 java -versiongit ubuntu配置git maven ubuntu配置maven 部署 添加 Jenkins 存储库 导入Jenkins存储库的GPG密钥 wget -q -O - https://pkg.jenkins.io/de…

el-upload组件的简单使用

最近公司的一个二期项目&#xff0c;开始要求复刻原有一期的功能页面。原先一期又不打算继续维护了&#xff0c;源码都没有。页面基本都涉及到了文件上传&#xff0c;以前很少使用到这个组件&#xff0c;公司有现成的表单设计器&#xff0c;文件上传都在组件里面拖动上传。在这…

【JavaEE】_线程与多线程的创建

目录 1. 线程的概念 2. 创建与使用多线程 2.1 方式1&#xff1a;继承Thread类 2.2 方式2&#xff1a; 实现Runnable接口 2.3 以上两种创建线程方式的对比 3. 多线程的优势-增加运行速度 1. 线程的概念 进程的存在是由于系统的多任务执行需求&#xff0c;这也要求程序员进…

LabVIEW卫星电视接收仿真系统

LabVIEW卫星电视接收仿真系统 随着卫星电视数字化的加速&#xff0c;传统模拟信号接收系统已无法满足需求。设计一套船载数字卫星电视接收系统&#xff0c;通过LabVIEW环境进行仿真实验&#xff0c;验证系统设计的可行性与有效性&#xff0c;满足数字信号接收的高精度要求&…

嵌入式Qt Qt中的信号处理

一.Qt中的信号处理 Qt消息模型&#xff1a; - Qt封装了具体操作系统的消息机制 - Qt遵循经典的GUI消息驱动事件模型 Qt中定义了与系统消息相关的概念; Qt中的消息处理机制&#xff1a; Qt的核心 QObject::cinnect函数&#xff1a; Qt中的“新”关键字&#xff1a; 实验1 初探…

Rust 基本环境安装

rust 基本介绍请看上一篇文章&#xff1a;rust 介绍 rustup 介绍 rustup 是 Rust 语言的安装器和版本管理工具。通过 rustup&#xff0c;可以轻松地安装 Rust 编译器&#xff08;rustc&#xff09;、标准库和文档。它也允许你切换不同的 Rust 版本或目标平台&#xff0c;以及…

petalinux安装的问题:

1. 安装是成功的&#xff0c;但是安装位置&#xff0c;就是用来存放petalinux的文件夹里没有文件 我是照着正点的文档安装的&#xff0c;出现的一个问题就是最后执行文件这里&#xff1a; -d 后面这个文件夹的路径&#xff0c;我看网上的教程也都是跟文档一致的 /opt/pkg/peta…

每日五道java面试题之java基础篇(十一)

目录: 第一题. Java死锁如何避免&#xff1f;第二题. 为什么⽤线程池&#xff1f;解释下线程池参数&#xff1f;第三题. 线程池的底层⼯作原理第四题. ReentrantLock中tryLock()和lock()⽅法的区别第五题. Sychronized和ReentrantLock的区别? 第一题. Java死锁如何避免&#x…

社区养老|社区养老服务系统|基于springboot社区养老服务系统设计与实现(源码+数据库+文档)

社区养老服务系统目录 目录 基于springboot社区养老服务系统设计与实现 一、前言 二、系统功能设计 三、系统实现 1、管理员部分功能 &#xff08;1&#xff09; 用户管理 &#xff08;2&#xff09;服务种类管理 &#xff08;3&#xff09;社区服务管理 &#xff08…