随笔分类 - LeeCode
437. 路径总和 III
摘要:题面 核心思想 树上的前缀和o(n) 当前的前缀和:curSum 用 Map 存储出现过的前缀和:preSum 如果 curSum - preSum == target 就说明有一段区间和为target,preSum出现了几次就有几段区间,所以用map存储前缀和出现的次数 代码 class Solu
1600. 王位继承顺序
摘要:题面 核心思想 纯模拟!没反应过来是前序遍历~ private Map<String,List<String>> children; 表示一个人的孩子 当调用getInheritanceOrder 时 通过map 搜索答案,由于孩子也有可能有孩子,无限套娃,所以通过递归搜索建立答案。 建立答案的时候
894. 所有可能的真二叉树(中等)
摘要:没做出来,难受 😫 核心思想 记忆化搜索 记录n个节点时,能够形成的真二叉树。 看注释吧~ ps: 节点是复用的,也就是会有不同节点指向同一个节点。 代码 class Solution { // map存储 剩余n个节点时 能够形成的真二叉树 防止重复计算 HashMap<Integer, Lis
1997. 访问完所有房间的第一天(中等)
摘要:核心思想 注意数据范围 0 <= nextVisit[i] <= i 也就是说 当前下标i只能去之前的地方 也就是说i+1 只能 通过 i 访问次数为偶数才能达到 定义 dp[i] 到达第i个房间的天数 那么要到达第i个房间的路径为 0 -> i-1 -> nextVisit[i-1] -> i-1
2580. 统计将重叠区间合并成组的方案数(中等)
摘要:核心思想 先按第一个元素排序,原区间重合的合并为一个,计算合并完后的区间个数。 每个区间都有2个选择,res不断乘2。 class Solution { public int countWays(int[][] ranges) { long res = 1; final int MOD = (int
(手写堆)215. 数组中的第K个最大元素(中等)
摘要:题面 核心思想 手写堆 构建一个大顶堆,删除k-1个堆顶元素。 为什么是size / 2 - 1? 考虑最后一个元素的下标 size - 1 那么父节点为 (size - 1) / 2 代码 class Solution { public int findKthLargest(int[] nums,
2642. 设计可以求最短路径的图类(中等)
摘要:核心思想 Dijkstra + 堆优化 模板题,每次查询做一次最短路查询即可。 class Graph { private List<int[]>[] nxt; public Graph(int n, int[][] edges) { nxt = new List[n]; for(int i = 0
3093. 最长公共后缀查询(困难)
摘要:核心思想 倒序的字典树,算是板子题吧。 也就是节点的成员变量有变化。 class Trie{ int idx; // 下标 int length; // 记录以此为后缀且长度最小的长度 Trie[] son; // 儿子 Trie(){ idx = (int) (1e4 + 10); length
3045. 统计前后缀下标对 II(困难)
摘要:核心思想 字典树看灵神把 这里提供一个不同的版本 map存放了int[] 需重写equals 和 hashCode class Node { Map<MyIntArray, Node> son = new HashMap<>(); int cnt; } class MyIntArray{ priva
3091. 执行操作使数据元素之和大于等于 K(中等)
摘要:核心思想 既然只有两种操作 最优解一定是 加1在前 复制在后 所以枚举从哪个数开始一直复制就好 上限就是 ceil(k / 2) class Solution { public int minOperations(int k) { if(k == 1) return 0; int res = (in
2617. 网格图中最少访问的格子数(困难)
摘要:核心思想 比较直观的想法就是BFS,但是每次遍历能走的点(右走,下走)会超时 考虑用两个set数组, TreeSet<Integer>[] R = new TreeSet[n]; TreeSet<Integer>[] C = new TreeSet[m]; R[i]表示第i行还剩下哪些列col没去过
503. 下一个更大元素 II(中等)
摘要:核心思想 维护一个单调递减的单调栈(非严格) 但是由于是循环的,做两次循环即可 代码 public int[] nextGreaterElements(int[] nums) { Deque<Integer> dq = new ArrayDeque<>(); int[] res = new int[
76. 最小覆盖子串(困难)
摘要:核心思想 滑动窗口,先从头开始找到包含t的子串,然后缩短窗口左边界,直到不包含再扩展右边界。 匹配过程: s = "ADOBECODEBANC", t = "ABC" 匹配:"ADOBEC" 缩短:"DOBEC" 匹配:"DOBECODEBA" 缩短:"ODEBA" 匹配:"ODEBANC" 缩短:
239. 滑动窗口最大值(困难)
摘要:核心思想 主要包含两个动作 nums[i]进 和 nums[i-k]出 新元素进入窗口旧元素移出窗口 最大值是谁这个区间各个元素都有可能 所以用一个set记录窗口的值,自定义排序从大到小,每次拿第一个就是最大值 同时用map记录数字出现次数,为0则移出set。 代码 class Solution {
2673. 使二叉树所有路径值相等的最小代价(中等)
摘要:思路 先看只有3个节点的子树,想要路径值相同,只能修改叶子节点的值,如上图只能2去+1操作。 核心思想:那么对于任意左右孩子节点,想要从根节点下来的路径相同,只能修改孩子节点。 所以我们只需要从下至上记录叶子节点到当前节点的路径值(左孩子,右孩子两条路),然后计算左右节点的差值。 详细看灵神树上贪心