随笔分类 - 算法
记录自己不大熟的LeetCode题目
摘要:题目链接 78. 子集 思路 求子集问题和 77.组合 (opens new window) 和 131.分割回文串 (opens new window) 又不一样了。 如果把子集问题、组合问题、分割问题都抽象为一棵树的话,那么组合问题和分割问题都是收集树的叶子节点,而子集问题是找树的所有节点! 其
阅读全文
摘要:题目链接 216. 组合总和 III 思路 与 【DFS】LeetCode 40. 组合总和 II 思路一致,只不过 candidates 数组在题目中明确说明了只有1到9。 代码 class Solution { private List<List<Integer>> result = new A
阅读全文
摘要:题目 40. 组合总和 II 思路 一道经典的排列组合去重问题,搜索的思路很简单,关键在于如何去重。 借用一下代码随想录的图 去重的工作实际上就是判断同一层上的相同元素是否已经被用过。即如果 candidates[i] == candidates[i - 1] 并且 used[i - 1] == f
阅读全文
摘要:题目链接 40. 组合总和 II 思路 一道经典的排列组合去重问题,搜索的思路很简单,关键在于如何去重。 借用一下代码随想录的图 去重的工作实际上就是判断同一层上的相同元素是否已经被用过。即如果 candidates[i] == candidates[i - 1] 并且 used[i - 1] ==
阅读全文
摘要:题目链接 39. 组合总和 思路 使用 DFS 进行排列组合,首先判断结束递归条件: sum > target sum == target index == len 因为每个数能取无限次,所以从 0 开始慢慢将 candidates[index] 加入到 sum 中,直到 sum > target,
阅读全文
摘要:题目链接 17. 电话号码的字母组合 思路 使用 DFS 进行枚举。 代码 class Solution { private HashMap<Character, char[]> map = new HashMap<>(); private List<String> result = new Arr
阅读全文
摘要:题目链接 131. 分割回文串 思路 使用 DFS,同时依次检查分割的字符串是否是回文串。 注意:需要频繁添加删除末尾元素时,可以使用 Deque 代码 class Solution { private List<List<String>> result = new ArrayList<>(); p
阅读全文
摘要:题目链接 1376. 通知所有员工所需的时间 思路 根据题目的条件,很容易知道 informTime == 0 的点是叶子结点,所以可以自底向上遍历,取最大值。 代码 class Solution { public int numOfMinutes(int n, int headID, int[]
阅读全文
摘要:题目链接 208. 实现 Trie (前缀树) 思路 字典树与多叉树非常类似,但是它本身结点不存储值。 什么意思呢? 多叉树结点一般是这样的: class Tree{ int value; Tree[] next; } 而字典树的结点一般是这样的: class Trie{ boolean isEnd
阅读全文
摘要:题目链接 79. 单词搜索 思路 DFS 模板题 代码 class Solution { public boolean exist(char[][] board, String word) { int m = board.length; int n = board[0].length; boolea
阅读全文
摘要:题目链接 990. 等式方程的可满足性 思路 并查集模板题,模板可以参考 常用算法模板。将字母视为结点,== 表示有路径,!= 表示无路径。 遍历 x == y,建立图前驱关系 遍历 x != y,检查是否和前驱关系对应 如果不对应,立即返回 false 全部遍历完成说明没有问题,返回 true 代
阅读全文
摘要:题目链接 1094. 拼车 思路 与 【扫描线】LeetCode 253. 会议室 II 思路一致 代码 class Solution { public boolean carPooling(int[][] trips, int capacity) { int[] temp = new int[10
阅读全文
摘要:题目链接 253. 会议室 II 思路 这道题非常类似于坐公交车上下车。 样例中 intervals = [[0,30],[5,10],[15,20]] 可以这么拆解 上车:[0, +1], [5, +1], [15, +1] 下车:[10, -1], [20, -1], [30, -1] 我们可以
阅读全文
摘要:题目链接 856. 括号的分数 思路 我们通过观察发现,() 是唯一贡献分数的结构,外括号只是为该结构添加了一些乘数。所以我们只需要关心 ()。 我们用 d 维护当前括号的深度,对于每个 ( 我们将深度加一,对于每个 ),我们将深度减一。当我们遇到 () 时,我们将 加到答案中。 我们举
阅读全文
摘要:题目链接 22. 括号生成 思路 使用 DFS 和贪心的思想,如果左括号的数量不够就优先放置左括号,然后再放置右括号。 代码 class Solution { private List<String> result = new ArrayList<>(); public List<String> g
阅读全文
摘要:题目链接 291. 单词规律 II 思路 定义一个全局 HashMap<Character, String> 来存储映射关系,key 为 pattern 的字符,value 为 str 的子串。 一开始,map 中没有任何映射关系。 把 pattern = "abab" 的第一个字符 'a' 和 s
阅读全文
摘要:题目链接 52. N 皇后 II 思路 与 【DFS】LeetCode 51. N 皇后 一致 代码 class Solution { private int result; private boolean[] mainDiag; private boolean[] subDiag; private
阅读全文
摘要:题目链接 51. N 皇后 思路 使用三个数组分别记录列、主对角线、副对角线的可放置状态。因为是按行进行搜索,在当前行放置后必进入下一行,所以不用记录行的状态。 private boolean[] mainDiagonal; private boolean[] subDiagonal; privat
阅读全文
摘要:题目链接 394. 字符串解码 思路 建立一个数字栈 numStack 和一个字符串栈 stringBuilderStack。遍历字符串 s: 遇到数字和字符时按照相应规则分别累加进 k 和 result 中。 遇到 [ 时将 k 和 result 的值压入栈中并清空变量。 遇到 ] 时将两个栈的栈
阅读全文
摘要:题目链接 341. 扁平化嵌套列表迭代器 思路 遍历 nestedList,碰见子列表便将该子列表传入下一层递归中遍历,直到遍历完所有元素。 代码 class NestedIterator implements Iterator<Integer> { ArrayList<Integer> resul
阅读全文