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.hqwc.cn/news/474238.html

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

相关文章

【类与对象 -2】学习类的6个默认成员函数中的构造函数与析构函数

目录 1.类的6个默认成员函数 2.构造函数 2.1概念 2.2特性 3.析构函数 3.1析构函数的概念 3.2特性 1.类的6个默认成员函数 如果一个类中什么成员都没有&#xff0c;简称为空类。 空类中真的什么都没有吗&#xff1f;并不是&#xff0c;任何类在什么都不写时&#xff0c;…

解锁Spring Boot中的设计模式—05.策略模式:探索【策略模式】的奥秘与应用实践!

1.策略者工厂模式&#xff08;Map版本&#xff09; 1.需求背景 假设有一个销售系统&#xff0c;需要根据不同的促销活动对商品进行打折或者其他形式的优惠。这些促销活动可以是针对不同商品类别的&#xff0c;比如男装、女装等。 2.需求实现 活动策略接口&#xff1a;定义了…

后端学习:Maven模型与Springboot框架

Maven 初识Maven Maven:是Apache旗下的一个开源项目&#xff0c;是一款用于管理和构建java项目的工具。 Maven的作用1.依赖管理2.统一项目结构3.项目构建依赖管理&#xff1a;方便快捷的管理项目依赖的资源(jar包)&#xff0c;避免版本冲突问题   当使用maven进行项目依赖…

【教学类-19-10】20240214《ABAB式-规律黏贴18格-手工纸15*15CM-一页3种图案,AB一组样板,纵向、有边框》(中班)

背景需求 利用15*15CM手工纸制作AB色块手环&#xff08;手工纸自带色彩&#xff09;&#xff0c;一页3个图案&#xff0c;2条为一组&#xff0c;画图案&#xff0c;黏贴成一个手环。 素材准备 代码展示 # # 作者&#xff1a;阿夏 # 时间&#xff1a;2024年2月14日 # 名称&…

19-k8s的附加组件-coreDNS组件

一、概念 coreDNS组件&#xff1a;就是将svc资源的名称解析成ClusterIP&#xff1b; kubeadm部署的k8s集群自带coreDNS组件&#xff0c;二进制部署需要自己手动部署&#xff1b; [rootk8s231 ~]# kubectl get pods -o wide -A k8s系统中安装了coreDNS组件后&#xff0c;会有一个…

BuildAdmin - 免费开源可商用!基于 ThinkPHP8 和 Vue3 等流行技术栈打造的商业级后台管理系统

一款包含 PHP 服务端和 Vue 前端代码的 admin 管理系统&#xff0c;实用性很强&#xff0c;推荐给大家。 BuildAdmin 是一个成熟的后台管理系统&#xff0c;后端服务采用 ThinkPHP8 &#xff0c;数据库使用 Mysql&#xff0c;前端部分则使用当前流行的 Vue3 / TypeScript / Vi…

K8s进阶之路-安装部署K8s

参考&#xff1a;&#xff08;部署过程参考的下面红色字体文档链接就可以&#xff0c;步骤很详细&#xff0c;重点部分在下面做了标注&#xff09; 安装部署K8S集群文档&#xff1a; 使用kubeadm方式搭建K8S集群 GitBook 本机&#xff1a; master&#xff1a;10.0.0.13 maste…

Vulnhub靶场 DC-6

目录 一、环境搭建 二、主机发现 三、漏洞复现 1、wpscan工具 2、后台识别 dirsearch 3、爆破密码 4、rce漏洞利用 activity monitor 5、rce写shell 6、新线索 账户 7、提权 8、拿取flag 四、总结 一、环境搭建 Vulnhub靶机下载&#xff1a; 官网地址&#xff1a…

stable diffusion webui学习总结(2):技巧汇总

一、脸部修复&#xff1a;解决在低分辨率下&#xff0c;脸部生成异常的问题 勾选ADetailer&#xff0c;会在生成图片后&#xff0c;用更高的分辨率&#xff0c;对于脸部重新生成一遍 二、高清放大&#xff1a;低分辨率照片提升到高分辨率&#xff0c;并丰富内容细节 1、先通过…

springboot登录校验

一、登录功能 二、登录校验 2.1 会话技术 2.2 JWT令牌 JWT令牌解析&#xff1a; 如何校验JWT令牌&#xff1f;Filter和Interceptor两种方式。 2.3 过滤器Filter 2.3.1 快速入门 修改上述代码&#xff1a; 2.3.2 详解 2.3.3 登录校验-Filter 2.4 Interceptor拦截器 2.4.1 …

多线程---线程同步,线程通信

线程同步 1.概述 线程同步是多线程编程中的一个重要概念&#xff0c;它指的是在多线程环境中&#xff0c;通过一定的机制保证多个线程按照某种特定的方式正确、有序地执行。这主要是为了避免并发问题&#xff0c;如死锁、竞态条件、资源争用等&#xff0c;确保数据的一致性和完…

MySQL数据库进阶第一篇(存储引擎与Linux系统上安装MySQL数据库)

文章目录 一、MySQL体系结构二、存储引擎介绍相关操作&#xff1a; 三、InnoDB 存储引擎简介四、MyISAM 存储引擎简介五、Memory 存储引擎简介六、存储引擎特点七、存储引擎的选择八、Linux系统上安装MySQL数据库1.用FinalShell远程连接Linux系统2.下载Linux版的MySQL安装包3.上…