随笔分类 - LeetCode
摘要:参考链接:https://blog.csdn.net/luo1454925298/article/details/105560466 排序算法性能比较: 时间复杂度计算 递推公式法 归并排序的递推公式是: merge_sort(p…r) = merge(merge_sort(p…q), merge_
阅读全文
摘要:怎么知道是贪心算法 贪心的本质是选择每一阶段的局部最优,从而达到全局最优。贪心算法一般都是从局部最优推导出全局最优,手动模拟一下感觉可以局部最优推出整体最优,而且想不到反例,那么就试一试贪心。 贪心一般解题步骤 贪心算法一般分为如下四步: 将问题分解为若干个子问题 找出适合的贪心策略 求解每一个子问
阅读全文
摘要:快速幂 50. Pow(x, n) 实现 pow(x, n) ,即计算 x 的 n 次幂函数(即,xn )。 快速幂解析(分治法角度): 快速幂实际上是分治思想的一种应用。 观察发现,当 n 为奇数时,二分后会多出一项 x 。 幂结果获取: 转化为位运算: 向下整除 n // 2等价于 右移一位 n
阅读全文
摘要:回溯算法能解决如下问题: 组合问题:N个数里面按一定规则找出k个数的集合 排列问题:N个数按一定规则全排列,有几种排列方式 切割问题:一个字符串按一定规则有几种切割方式 子集问题:一个N个数的集合里有多少符合条件的子集 棋盘问题:N皇后,解数独等等 如何理解回溯法 回溯法解决的问题都可以抽象为树形结
阅读全文
摘要:LFU 算法 参考labuladong的文章 LFU 算法相当于是淘汰访问频次最低的数据,如果访问频次最低的数据有多条,需要淘汰最旧的数据。把数据按照访问频次进行排序,而且频次还会不断变化。 要求你写一个类,接受一个capacity参数,实现get和put方法: class LFUCache { /
阅读全文
摘要:Union-Find 并查集算法 参考labuladong的文章 动态连通性其实可以抽象成给一幅图连线,如图: Union-Find 算法主要需要实现这两个 API: class UF { /* 将 p 和 q 连接 */ public void union(int p, int q); /* 判断
阅读全文
摘要:本文会从递归反转整个单链表开始拓展 递归反转整个链表 先直接看实现代码: ListNode reverse(ListNode head) { if (head.next == null) return head; ListNode last = reverse(head.next); head.ne
阅读全文
摘要:快速排序就是个二叉树的前序遍历,归并排序就是个二叉树的后序遍历 简单分析一下他们的算法思想和代码框架: 快速排序的逻辑是,若要对 nums[lo..hi] 进行排序,我们先找一个分界点 p,通过交换元素使得 nums[lo..p-1] 都小于等于 nums[p],且 nums[p+1..hi] 都大
阅读全文
摘要:二叉树的最近公共祖先 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 遇到任何递归型的问题,无非就是灵魂三问: 1、这个函数是干嘛的? 情况 1,如果p和q都在以root为根的树中,函数返回的即使p和q的最近公共祖先节点。 情况 2,那如果p和q都不在以root为根的树中怎么办呢?函数理所
阅读全文
摘要:前序遍历框架如下: void traverse(TreeNode root) { if (root == null) return; // 前序遍历的代码 traverse(root.left); traverse(root.right); } 后序遍历的代码框架: void traverse(Tr
阅读全文
摘要:二叉搜索树的升序输出或者升序查找第k个元素之类的问题可以依靠中序遍历,BST 相关的问题,要么利用 BST 左小右大的特性提升算法效率,要么利用中序遍历的特性满足题目的要求 如果当前节点会对下面的子节点有整体影响,可以通过辅助函数增长参数列表,借助参数传递信息。 在二叉树递归框架之上,扩展出一套 B
阅读全文
摘要:LeetCode 股票买卖问题 不用递归思想进行穷举,而是利用「状态」进行穷举。我们具体到每一天,看看总共有几种可能的「状态」,再找出每个「状态」对应的「选择」。我们要穷举所有「状态」,穷举的目的是根据对应的「选择」更新状态。听起来抽象,你只要记住「状态」和「选择」两个词就行,下面实操一下就很容易明
阅读全文
摘要:滑动窗口 滑动窗口算法框架 /* 滑动窗口算法框架 */ void slidingWindow(string s, string t) { unordered_map<char, int> need, window; for (char c : t) need[c]++; int left = 0,
阅读全文
摘要:BFS框架: // 计算从起点 start 到终点 target 的最近距离 int BFS(Node start, Node target) { Queue<Node> q; // 核心数据结构 Set<Node> visited; // 避免走回头路 q.offer(start); // 将起点
阅读全文
摘要:动态规划 重叠子问题、最优子结构、状态转移方程就是动态规划三要素 思考状态转移方程: 明确 base case → 明确「状态」-> 明确「选择」 → 定义 dp 数组/函数的含义。 # 初始化 base case dp[0][0][...] = base # 进行状态转移 for 状态1 in 状
阅读全文
摘要:思路: 解决一个回溯问题,实际上就是一个决策树的遍历过程。你只需要思考 3 个问题: 1、路径:也就是已经做出的选择。 2、选择列表:也就是你当前可以做的选择。 3、结束条件:也就是到达决策树底层,无法再做选择的条件。 回溯算法的框架: result = [] def backtrack(路径, 选
阅读全文