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

本文为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 cfp

class Solution:
 def sortedArrayToBST_base(self, nums):
     ilen = len(nums)
     if ilen == 0: return None
     return 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 cfp

class Solution:
 def sortedArrayToBST_ext1(self, nums):
     if not nums:
         return
     imid = len(nums) // 2
     root = TreeNode(nums[imid])
     if imid == 0:  
         return root
     root.left = self.sortedArrayToBST_ext1(nums[:imid])
     root.right = self.sortedArrayToBST_ext1(nums[imid + 1:])
     return root

result = 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 cfp

class Solution:
 def sortedArrayToBST_ext2(self, nums):
     def sortedarraytobst(left, right):
         if left > right: return None
         imid = (left + right) // 2
         return 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 ~

  • 17
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

长孤秋落

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值