摘要:
递归 最容易想到,采用先序遍历。 1.遍历数组,找出当前区间的最大值; 2.使用该最大值作为根节点; 3.对数组的左半部分和右半部分递归调用构建最大二叉树。 这种方式是标准的 分治法,每次递归都需要遍历当前区间,找到最大值。因此,时间复杂度是 O(n^2),因为每一层递归都会遍历一遍数组,且递归的深 阅读全文
摘要:
这两道题目对于递归函数的返回值是不同的,这里进行总结,二叉树遍历中递归函数返回值何时有何时没有。 这里总结如下三点: 如果需要搜索整棵二叉树且不用处理递归返回值,递归函数就不要返回值。(这种情况就是路径总和ii) 如果需要搜索整棵二叉树且需要处理递归返回值,递归函数就需要返回值。 (这种情况我们在2 阅读全文
摘要:
自顶向下递归(前序遍历) 这种方法是一开始想到的,虽然ac了但是对于它的本质却不清不楚,不知道时间复杂度,不知道属于前序遍历。 思路 首先得到root节点的左右子树的深度(左右),若深度差绝对值大于1(中),则root为根的树不是平衡二叉树; 否则继续递归root的左右子树,其左右子树都是平衡二叉树 阅读全文
摘要:
思路 一、层序遍历,时间复杂度O(n) 二、利用完全二叉树性质,时间复杂度O(logn * logn)(小于O(n)) 完全二叉树性质:若树深度为h,则前h-1层节点都达到最大值。第h层节点都集中在最左侧的位置 完全二叉树要么1.是满二叉树 2.最后一层没满 满二叉树计算节点数太方便了,直接用公式2 阅读全文
摘要:
递归 每次写递归,都按照这三要素来写,可以保证大家写出正确的递归算法! 确定递归函数的参数和返回值: 确定哪些参数是递归的过程中需要处理的,那么就在递归函数里加上这个参数, 并且还要明确每次递归的返回值是什么进而确定递归函数的返回类型。 确定终止条件: 写完了递归算法, 运行的时候,经常会遇到栈溢出 阅读全文
摘要:
法一、用数组排序 思路 用map保存元素和频率关系 将元素和频率的键值对pair作为vector的基本元素,以频率为准进行从大到小的排序 —— O(nlogn) 输出前K个pair的first,即数字本身 代码 class Solution { public: std::vector<int> to 阅读全文
摘要:
逆波兰表达式 思路 用栈操作运算:遇到数字则入栈;遇到算符则取出栈顶两个数字进行计算,并将结果压入栈中 这里记录string类型相关操作: 判断token是否是数字,不可像char类型用string重载的>=,<=,前者由于用ASCII码表示,后者按字典序比较,例如1<2所以字符串比较 "10" < 阅读全文
摘要:
题目 给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。 有效字符串需满足: 1.左括号必须用相同类型的右括号闭合。 2.左括号必须以正确的顺序闭合。 3.每个右括号都有一个对应的相同类型的左括号。 提示: 1 <= s.length <= 104 阅读全文
摘要:
题目描述(难度hard) 给你一个字符串 S、一个字符串 T,请在字符串 S 里面找出:包含 T 所有字母的最小子串。 示例: 输入: S = "ADOBECODEBANC", T = "ABC" 输出: "BANC" 说明: 如果 S 中不存这样的子串,则返回空字符串 ""。 如果 S 中存在这样 阅读全文
摘要:
打算为项目增加音效,但是没有头绪不知从何做起。想要做一个便于拓展的音效管理系统,通过搜集网上资料暂时得到以下两种方案。(虽然实现方式远不止两种)其中对象池技术早有耳闻,趁此机会学习并应用。 一、创建一个AudioManager AudioManager通常是一个单例(Singleton)类,负责管理 阅读全文