0%

删除节点:
LC669 修剪二叉搜索树
LC450 删除二叉搜索树中的节点

根据有序数组生成BST:
LC108 有序数组生成BBST[2]
LC109 有序链表生成BBST
LC95 生成所有BST[2](注意在空区间时,要返回vector<TreeNode*>{nullptr}
LC96 生成所有BST - 数量[2]
LC654 生成最大的BST[1]

验证BST
LC98 验证BST[2]这个题会用INT32_MIN来测试,所以我们用INT64_MIN来记录上一个节点。
LC面试题33 二叉搜索树的后续遍历序列
⚠️LC255 验证前序遍历序列二叉搜索树(单调栈)

二叉搜索树展成链表:
⚠️LC426 BST展开为双向链表
LC114 BST展开为单向链表

二差搜索树的后继节点:
LC173 二叉搜索树迭代器 hasNext()的条件
⚠️LC285 Inorder Successor in BST没有双亲节点指针
LC510 Inorder Successor in BST II有双亲节点指针

LC230 Kth Smallest Element in a BST
LC272 最接近的二叉搜索树值II

LC99 恢复二叉搜索树[2]没有INT32_MIN这种坑
⭕️LC538 把二叉搜索树转变为累加树[1]
⚠️LC501 二叉搜索树中的众数[1]

Read more »

std::unique_pointer

1
2
3
4
5
6
7
8
9
10
template<
class T,
class Deleter = std::default_delete<T>
> class unique_ptr;

//数组特化版本
template <
class T,
class Deleter
> class unique_ptr<T[], Deleter>;

特点

  • 独占对象所有权
  • 无法拷贝,只能移动。通过move assignment operator转移所有权给另一个unique_ptr。
  • 析构时会保证调用其占有对象的析构函数。但在以下状况中,不能保证对象的析构函数会被调用:
    • 线程的主进程抛出异常
    • noexcept函数抛出异常
    • std::abort, std::exit等其他exit函数被调用
  • 可自定义删除器,要求删除器可默认构造且不抛出异常。删除器会影响std::unique_ptr<T, deleter>的类型
  • 不使用自定义的删除器时,可以默认std::unique_ptr和裸指针有一样的大小。
    • 使用函数指针当作自定义删除器,大小增加一个word
    • 使用stateless function object(没有捕获的lambda表达式)当作自定义删除器,不增加大小
  • 注意区别初等模版和数组特化模版
    • 初等模版没有提供operator[]
    • 数组特化没有提供解引用operator*operator->
    • 因为STL提供了很好的容器,所以很少有可能性会用到数组特化,除非为了兼容C API.
  • std::shared_ptr可以通过一个std::unique_ptr&&直接构造
Read more »

栈与队列的设计
LC641 Design Circular Deque
LC155 Min Stack
LC716 Max Stack
LC896 Maximum Frequency Stack
LC232 Implement Queue using Stacks [第二个栈空了,就把第一个导入第二个。不空就从第二个取]
LC225 Implement Stack using Queues

单调队列:
LC239 Sliding Windows Maximum
LC861 Shortest Subarray with Sum at Least K[仍然不理解为什么]

简单单调栈(Next Greater Element及其变种):
LC496 Next Greater Element I
LC503 Next Greater Element II [循环数组]
LC1019 链表中下一个更大节点
LC739 Daily Temperatures
LC901 Online Stock Span

复杂单调栈(面积计算类):
LC42 Trapping Rain Water [lmr三个一组算trap]
LC84 Largest Rectangle in Histogram [以每个柱子的高,能围成的最大面积]
LC85 Maximal Rectangle [二维柱状图面积]

栈与括号
LC394 Decode String

Read more »

实现了二叉堆的基本算法:adjust_heap(下沉),pop_heappush_heapmake_heap,和sort_heap

Read more »

子序列/子串问题:
LC128 最长连续序列
LC53 最大子序和
LC71 编辑距离
LC1143 最长公共子序列

LC300 最长上升子序列
面试题17.08 马戏团人塔
LC354 俄罗斯套娃信封问题

⚠️ LC152 乘积最大子序列
LC1048 最长字符串链

买卖股票:
LC121 买卖股票的最佳时机
LC122 买卖股票的最佳时机II
LC122 买卖股票的最佳时机III
LC188 买卖股票的最佳时机IV
LC309 最佳买卖股票时机含冷冻期
LC714 买卖股票的最佳时机含手续费

打家劫舍:
LC337 打家劫舍III

矩阵中的路径问题:
LC62 不同路径
LC64 最小路径和

01背包问题:
LC494 目标和[装满解的数目]
完全背包问题:
LC279 完全平方数
LC322 Coin Change
LC518 Coin Change 2
二维费用的背包问题:
LC474 Ones and Zeroes

LC221 最大正方形


推荐读物:

Read more »

二叉树的DFS:
⭕️LC144 Binary Tree Preorder Traversal
⭕️LC94 Binary Tree Inorder Traversal
⭕️LC145 Binary Tree Postorder Traversal

二叉树的BFS:
⭕️LC102 Binary Tree Level Order Traversal
⭕️LC107 Binary Tree Level Order Traversal II
⭕️103. Binary Tree Zigzag Level Order Traversal
⭕️LC662 二叉树的最大宽度
⭕️LC199 二叉树的右视图
LC513 找树左下角的值
LC116 填充每个节点的下一个右侧节点指针
LC117 填充每个节点的下一个右侧节点指针II
LC919 完全二叉树插入器
LC1302 层数最深叶子节点的和

序列化与反序列化二叉树:
⚠️LC655 输出二叉树
⭕️LC297 Serialize and Deserialize Binary Tree[前序遍历,nullptr要有占位符]

二叉树的坐标化:
LC665 输出二叉树
LC987 二叉树的垂序遍历

根据遍历序列重建二叉树:
⭕️LC106 Construct Binary Tree from Inorder and Postorder Traversal
⭕️LC105 Construct Binary Tree from Preorder and Inorder Traversal

向下路径与叶子路径:
LC129 Sum Root to Leaf Numbers
⭕️LC104 Maximum Depth of Binary Tree
⚠️LC111 Minimum Depth of Binary Tree
LC257 二叉树的所有路径
LC112 Path Sum
LC113 Path Sum II
LC437 Path Sum III

折返路径:
LC543 二叉树的直径
LC687 最长同值路径
LC124 折返路径和
LC110 平衡二叉树

两个二叉树的关系:
⭕️LC100 相同的树
⭕️LC面试题26. 树的子结构
LC572 Subtree of Another Tree
LC面试题04.10 检查子树
LC617 合并二叉树

对称的二叉树:
LC226 求二叉树的镜像
LC101 Symmertic Tree

最低公共祖先:
LC235 Lowest Common Ancestor of a Binary Search Tree
LC236 Lowest Common Ancestor of a Binary Tree
LC742 二叉树最近的叶节点

其他:
⚠️LC222 完全二叉树的节点个数
LC545 二叉树的边界
LC114 二叉树展开为链表

子树类问题:
LC250 统计同值子树
LC1120 子树的最大平均值

Read more »