leetcode654-最大二叉树

leetcode 654

思路

首先找到数组中最大的值,作为根节点,然后左子树就递归最大值的左边数组,右子树就递归最大值右侧的数组,分别也找到最大值作为节点,当数组不存在的时候说明递归结束,没有节点可递归,如果数组中只存在一个值的时候,也没必要再去专门查询一次最大值,因为只有当前一个值,那可以直接构造当前节点

实现

js 复制代码
class TreeNode {
    constructor(val) {
        this.val = val;
        this.left = null;
        this.right = null;
    }
}
var constructMaximumBinaryTree = function (nums) {
    if (!nums.length) return null;
    const deep = (nums) => {
        if (!nums.length) return null;
        if (nums.length === 1) {
            return new TreeNode(nums[0])
        }
        // 获取最大值以及索引
        const [max, index] = findMaxNumber(nums)
        // 构造根节点
        const root = new TreeNode(max);
        // 分割
        const left = nums.slice(0, index)
        const right = nums.slice(index + 1)
        root.left = deep(left)
        root.right = deep(right)
        return root
    }
    return deep(nums)
};
var findMaxNumber = function (arr) {
  let max = -Infinity, index = 0
  for (let i = 0; i < arr.length; i++) {
    if (arr[i] > max) {
      max = arr[i]
      index = i;
    }
  }
  return [max, index];
}

优化

上面的版本虽然容易理解,但是每次都生成了新的数组,这样很消耗空间和时间,所以进行了优化,利用索引来获取需要的范围,只需要对初始的数组进行修改即可,而节约了构造数组的消耗

js 复制代码
class TreeNode {
    constructor(val) {
        this.val = val;
        this.left = null;
        this.right = null;
    }
}
var constructMaximumBinaryTree = function (nums) {
  const deep = (nums, left, right) => {
    if (left > right) return null;
    let max = -Infinity, index = -1;
    for (let i = left; i <= right; i++) {
      if (nums[i] > max) {
        max = nums[i]
        index = i;
      }
    }
    let root = new TreeNode(max);
    root.left = deep(nums, left, index - 1)
    root.right = deep(nums, index + 1, right)
    return root;
  }
  return deep(nums, 0, nums.length - 1)
};
相关推荐
Robert--cao6 分钟前
移动底盘与机械臂联合规划:开源算法与工程实现
算法
小豆庄1 小时前
Mac 上给视频人脸打码:本地工具的依赖、追踪与推理管线
算法·视觉检测·视频·敏捷流程·纹理贴图
星夜离尘561 小时前
MATLAB 工程实验:从相邻块均值手写重叠 Allan 偏差,数清有效项
算法·matlab·均值算法
酷炫码神2 小时前
Day 10|Pinia 状态管理:把散落在各组件的数据,收进一个全局仓库
android·开发语言·javascript
careathers2 小时前
【数据结构】从堆到 PriorityQueue:手写一个优先级队列
数据结构
y1su3 小时前
Leetcode 字符串模板
java·数据结构·算法·leetcode·职场和发展·动态规划
residual_fan4 小时前
船用柴油机动态机动工况故障诊断:控制感知仿射网络(CAAN)的技术实现
人工智能·算法·数据挖掘·数据分析
酷炫码神4 小时前
Day 8|Vue3 响应式:告别手动操作 DOM,让数据驱动界面
javascript·vue.js·ecmascript
其实防守也摸鱼4 小时前
Cylab在线靶场——CTF中的通用技能
linux·数据库·学习·算法·靶场·ctf·学习网络安全
蓝悦无人机5 小时前
《Planning algorithms》读书笔记——第8章 反馈运动规划
算法·读书笔记·反馈运动规划