02 2024 档案
摘要:想不到,根本想不到 买卖股票的最佳时机Ⅱ leetcode:122. 买卖股票的最佳时机 II 贪心法 思路 任何一天的累计利润都可以拆成之前每天相比前一天的利润之和,因此最大利润就是收集了每天的正利润。 复杂度分析 时间复杂度:O(N)。 空间复杂度:O(1)。 注意点 略 代码实现 class
阅读全文
摘要:贪心的一天,头好晕 理论基础 什么是贪心 每次选择都采取局部最优,最终得到全局最优。 (一定是每个阶段都采取局部最优,能够推出全局最优的,如果得不到全局最优就不用贪心法) 套路 没有套路。 但是可以判断用不用贪心: 通过数学归纳/反证法的方式,模拟一下看看能不能局部最优->整体最优。 (一般情况下就
阅读全文
摘要:重新安排行程 暂时没精力看,pass N皇后 leetcode:51. N 皇后 回溯法 思路 遍历二维数组,每层递归遍历一层的可能性。 需要注意的是vector<string> 是非常自然的适合一层一层遍历的二维数组数据结构。 检查,如果满足要求,就放入Q。 复杂度分析 时间复杂度: 在 back
阅读全文
摘要:递归子序列 leetcode:491. 非递减子序列 回溯法 思路 类似子集Ⅱ,每个元素大于二的节点都放入结果集。 在填充path的过程中,检查是否满足非严格递增(是否等于末元素或比它大)。 但是由于本题不能排序,之前的去重策略(数组排序,检查nums[i - 1] == nums[i] && us
阅读全文
摘要:阶段性还完了旧账 复原IP地址 leetcode:93. 复原 IP 地址 回溯法 思路 和分割回文串类似,只是回文串检测改为IP合法检测。 终止条件也值得注意: 复杂度分析 时间复杂度: 空间复杂度: 注意点 代码实现 递归不一定要返回!! class Solution { private: ve
阅读全文
摘要:组合总和 leetcode:39. 组合总和 回溯法 思路 在组合的基础上,只不过同一个数字可以重复选取,递归时传入i即可(组合是传入i+1)。 复杂度分析 时间复杂度: 在最坏情况下,回溯算法会遍历所有可能的组合,因此时间复杂度取决于解的个数。假设候选数组的长度为n,目标值为target,最坏情况
阅读全文
摘要:组合总和Ⅲ leetcode:216. 组合总和 III 回溯法 思路 组合的基础上,在找组合的过程中,把和为N的记录下来。 复杂度分析 时间复杂度:O(C(K,9))。 空间复杂度:空间复杂度主要来自递归调用时维护的栈空间和存储结果的二维数组,分别为O(k) 和O(C(K,9)*K)。 注意点 略
阅读全文
摘要:回校补卡~(回来之后反而懒了 回溯理论基础 什么是回溯法 回溯本质上就是穷举,一种纯暴力搜索。 应用 使用原因 问题很复杂,没有更好的办法,只能暴力搜索。 解决的问题 组合问题:N个数里面按一定规则找出k个数的集合 排列问题:N个数按一定规则全排列,有几种排列方式(有序的组合) 切割问题:一个字符串
阅读全文
摘要:修剪二叉搜索树 leetcode:669. 修剪二叉搜索树 递归法 思路 和删除搜索树节点类似,递归向上返回子树。 碰到NULL节点,向上抛NULL; 如果值小于左边界,那么当前根节点和左子树都要剪掉,返回递归右子树的结果; 如果值大于右边界,那么当前根节点和右子树都要剪掉,返回递归左子树的结果;
阅读全文
摘要:二叉搜索树的最近公共祖先 leetcode:235. 二叉搜索树的最近公共祖先 递归法 思路 搜索树节点是有序的,若节点值大于p、q则在右子树查询;若节点值小于p、q则在左子树查询;其他情况(节点值在两者之间、节点值等于p值或q值),node就是最近的公共祖先。 复杂度分析 时间复杂度:O(logN
阅读全文
摘要:过外婆八十寿宴,补卡 二叉搜索树的最小绝对差 leetcode:530. 二叉搜索树的最小绝对差 双指针中序遍历法 思路 搜索树的最小绝对差一定出现在中序遍历的相邻两个元素之间。 设置前后两个指针,每次对比“历史最小”与当前node->val - pre->val的值哪个更小,进行相应更新。 复杂度
阅读全文
摘要:过外婆八十寿宴去了,补卡 最大二叉树 leetcode:654. 最大二叉树 递归法 思路 构造二叉树都要用前序遍历:先有根,才有其他。 复杂度分析 时间复杂度:O(N^2)。 空间复杂度:最差时(单调增or减-)O(N)。 注意点 递归时候传入值是变量begin、end而不是写死的。 代码实现 /
阅读全文
摘要:找树左下角的值 leetcode:513. 找树左下角的值 层序迭代法 思路 层序遍历,每次更新result为每层最左侧元素。 复杂度分析 时间复杂度:遍历,O(N)。 空间复杂度:队列层序遍历,树近似完全二叉树时O(N),树极倾斜时O(logN)。 注意点 略 代码实现 /** * Definit
阅读全文
摘要:年假后的第一天,感觉一切回到解放前T T *衡二叉树 leetcode:110. *衡二叉树 后序递归求高度差法 思路 类似104. 二叉树的最大深度,求左右子树的最大深度(后序遍历求该点的最大高度,其实就等于该子树的最大深度) 复杂度分析 时间复杂度:O(N)。 空间复杂度:**衡时树为O(log
阅读全文
摘要:终于熬到了春节假~~有些手感了 深度与高度 深度是从根结点到叶结点的距离;高度是从叶结点到根结点的距离。 深度从上往下(根为1);高度从下往上(叶为1)。 二叉树最大深度 leetcode:104. 二叉树的最大深度 后序递归法 思路 复杂度分析 时间复杂度:O(N)。遍历了一遍。 空间复杂度:和层
阅读全文
摘要:层序遍历 leetcode: 102. 二叉树的层序遍历 107. 二叉树的层序遍历 II 199. 二叉树的右视图 637. 二叉树的层平均值 429. N 叉树的层序遍历 515. 在每个树行中找最大值 116. 填充每个节点的下一个右侧节点指针 104. 二叉树的最大深度 111. 二叉树的最
阅读全文
摘要:二叉树理论基础 分类 满二叉树:只有度为0和度为2的结点,且度为0结点在同一层上(每一层的结点都是满的)。 完全二叉树:除了底层外其他层结点都是满的(底层当然也可以是满的),且底层结点从左往右连续不断。 二叉搜索树: 树的每个结点满足: 左子树所有结点值均小于根结点的值 右子树所有结点值均大于根结点
阅读全文
摘要:滑动窗口最大值 leetcode:239. 滑动窗口最大值 第一个hard!work out!资源占用竟然如此之大,, 单调队列法 思路 需要一个抽象的类队列数据结构,每轮移动时:1. 把队首pop;2.把下一元素push进队尾;3.获取队列最大值存入数组。 pop实现:每次移动时尝试(说“尝试”是
阅读全文
摘要:有效的括号 leetcode:20. 有效的括号 实现 思路 遍历到左括号,入栈对应的右括号(方便遍历到右括号时进行对比);遍历到右括号,对比栈顶元素。 把无效三种情况照顾到:1. 左括号多了(遍历结束后栈不为空);2. 左右括号不匹配(右括号时栈顶元素与当前元素对比);3. 右括号多了(右括号时栈
阅读全文
摘要:用栈实现队列 实现 思路 用两个栈实现。入队用输入栈stIn,出队用输出栈stOut。 实现pop()时,要注意pop只删除,不返回值。 复杂度分析 略 注意点 stack的pop只能弹出,不返回值;弹出并获取值分成:用top()记录栈顶值、用pop()弹出(删除)栈顶值。 class方法调用要用-
阅读全文
摘要:实现strStr 暴力遍历法 思路 双层循环,第一层遍历原字符串,第二层同时遍历寻找的字符串,一旦不匹配时,第一层退回到起始字符的下一位重新开始遍历。 复杂度分析 时间复杂度:最差时O(N^M)。最差情况每个寻找字符到最后一个字符不匹配,操作次数为原字符串长度N*寻找字符长度M。 空间复杂度:O(1
阅读全文
摘要:反转字符串 leetcode:344. 反转字符串 双指针法 思路 双指针中间靠拢,靠拢过程同时引入第三只被子以交换两个杯子的水。 复杂度分析 时间复杂度:O(N)。遍历一遍字符串 空间复杂度:O(1)。 注意点 while条件是left < right。 可以用swap()函数交换两个数的值。 代
阅读全文