04 2023 档案
摘要:题目: 思路: 【1】深度优先搜索的方式 代码展示: 记忆化深度优先搜索(对已经遍历过的进行记录,达到优化的效果) //时间8 ms击败79.10% //内存43.1 MB击败5.3% class Solution { public int[][] dirs = {{-1, 0}, {1, 0},
阅读全文
摘要:题目: 思路: 【0】思路源于模拟圆柱的思想 以一下数据为例: [ {1,0,0,0,1,1,0,0,1}, {1,0,0,0,0,1,0,0,1}, {1,0,0,0,1,1,0,0,1}, {1,0,1,1,1,1,0,0,1}, {1,1,0,1,1,1,0,0,1} ] 首先计算出矩阵的每个
阅读全文
摘要:题目: 思路: 【1】以中心扩散为思路的暴力破解方法 【2】单调栈的方式(基础模型:在一维数组中对每一个数找到第一个比自己小的元素。这类“在一维数组中找第一个满足某种条件的数”的场景就是典型的单调栈应用场景。)【其实可以参考 剑指 Offer 30. 包含min函数的栈 】 代码展示: 单调栈 +
阅读全文
摘要:题目: 思路: 【1】该题目算是开放式的吧,并没有什么标准,也就是说,输入可以自己定,也可以常规的[1,2,3,null,null,4,5,null,null,null,null]或者[1,2,3,null,null,4,5],但是需要的是你自己能识别,然后能转成树,又能从树转回去即可。其实思想最接
阅读全文
摘要:题目: 思路: 【0】这道题看题目的话有可能会出现懵逼状态,这道题其实和 剑指 Offer II 116. 省份数量(547. 省份数量) 很相似。相当于给一个字符串数组,每一个字符就是一个点,如果两字符相似(即交换字符串 X 中的两个不同位置的字母,使得它和字符串 Y 相等),那么就表示它们联通。
阅读全文
摘要:题目: 思路: 【1】顺序合并 【2】分治合并 【3】使用优先队列合并 代码展示: 顺序合并的方式: //时间99 ms击败23.18% //内存43.6 MB击败9.45% //时间复杂度:假设每个链表的最长长度是 n。在第一次合并后,ans 的长度为 n; //第二次合并后,ans 的长度为 2
阅读全文
摘要:题目: 思路: 【1】利用数组来实现迭代器的方式 【2】单调栈的方式 代码展示: 单调栈的方式: //时间16 ms击败96.48% //内存45.6 MB击败13.31% //时间复杂度:显然,初始化和调用 hasNext() 都只需要 O(1) 的时间。 //每次调用 next() 函数最坏情况
阅读全文
摘要:题目: 思路: 【1】并查集 代码展示: //时间0 ms击败100% //内存41.4 MB击败90.40% //时间复杂度:O(nlogn),其中 n 是图中的节点个数。 //需要遍历图中的 n 条边,对于每条边,需要对两个节点查找祖先,如果两个节点的祖先不同则需要进行合并,需要进行 2 次查
阅读全文
摘要:题目: 思路: 【1】深度优先搜索的方式 【2】广度优先搜索的方式 【3】并查集的方式 代码展示: 并查集的方式: //时间1 ms击败87.49% //内存42.4 MB击败22.88% class Solution { public int findCircleNum(int[][] isCon
阅读全文
摘要:题目: 思路: 【0】首先是读题,看的是玄里玄乎的,但其实本质上就是问sequences是否存在路径能够走完整个nums数组。如nums是【1,2,3】而sequences存在【1,2】和【2,3】,故从1走到2,再从2走到3,实际上便是走完了整个nums数组。 【1】使用边hash比对的方式: 【
阅读全文
摘要:题目: 思路: 【1】广度优先搜索的方式 代码展示: 广度优先搜索的方式: //时间4 ms击败77.47% //内存42.5 MB击败61.26% //时间复杂度: O(n+m),其中 n 为课程数,m 为先修课程的要求数。 //这其实就是对图进行广度优先搜索的时间复杂度。 //空间复杂度: O(
阅读全文
摘要:题目: 思路: 【0】并查集的方式 【1】广度优先搜索的方式 【2】Floyd 算法的方式 【3】带权并查集的方式 代码展示: 并查集的方式: //时间0 ms击败100% //内存40.1 MB击败36.27% //时间复杂度:O((N+Q)logA), //构建并查集 O(NlogA) ,这
阅读全文
摘要:题目: 思路: 【1】回溯的方式 代码展示: 回溯的方式: //时间1 ms击败100% //内存43.5 MB击败43.56% class Solution { public List<List<Integer>> allPathsSourceTarget(int[][] graph) { Lis
阅读全文
摘要:题目: 思路: 【1】深度搜索的方式: 【2】广度搜索的方式: _ _ _ _ _ 1 _ _ 2 1 2 _ 2 1 2 3 2 1 2 3 _ 0 _ _ ==> 1 0 1 _ ==> 1 0 1 2 ==> 1 0 1 2 ==> 1 0 1 2 _ _ _ _ _ 1 _ _ 2 1 2
阅读全文
摘要:题目: 思路: 【1】回溯算法的方式,本题的递归树模型是一棵多叉树; 【2】回溯 + 动态规划预处理的方式 【3】回溯 + 记忆化搜索的方式 代码展示: 回溯算法的方式: //时间8 ms击败62.40% //内存53.2 MB击败96.99% class Solution { public Lis
阅读全文
摘要:题目: 思路: 【0】依据题意可知其实就是把联通的两个节点分别置于两个集合中,如示例2中,0与1联通,那么0放置于A集合,1放置于B集合,而0又与3联通,且此时0在A集合中,故只能把3放置于B集合中,然后2又与3联通故也只能放在A集合,此时全部元素都放入了集合之中,且不冲突则表示成功,若,存在某元素
阅读全文
摘要:题目: 思路: 【1】动态规划的方式 【2】组合数学 代码展示: 组合数学的方式: //时间0 ms击败100% //内存38.3 MB击败47.78% //时间复杂度:O(m)。 //由于我们交换行列的值并不会对答案产生影响,因此我们总可以通过交换 m 和 n 使得 m≤n,这样空间复杂度降低至
阅读全文
摘要:题目: 思路: 【1】广度优先搜索: 代码展示: //时间63 ms击败79.94% //内存45 MB击败74.14% class Solution { public int openLock(String[] deadends, String target) { if ("0000".equal
阅读全文
摘要:题目: 思路: 【1】深度优先搜索 【2】前缀和的方式 代码展示: 前缀和的方式: //时间2 ms击败100% //内存40.9 MB击败75.50% //时间复杂度:O(N),其中 N 为二叉树中节点的个数。利用前缀和只需遍历一次二叉树即可。 //空间复杂度:O(N)。 //树上问题转换一维问题
阅读全文
摘要:题目: 思路: 【1】深度优先搜索 【2】广度优先搜索 代码展示: 广度优先搜索: //时间7 ms击败6.66% //内存41.3 MB击败88.39% //时间复杂度:O(m×n)。其中 m 是给定网格中的行数,n 是列数。我们访问每个网格最多一次。 //空间复杂度:O(m×n),队列中最多会存
阅读全文
摘要:题目: 思路: 【1】动态规划的方式 代码展示: 针对枚举进行空间复杂度的降低(空间优化): //输入的示例(将每一行的左端对齐,那么会形成一个等腰直角三角形,也可以说像是梯形) //[2] //[3,4] //[6,5,7] //[4,1,8,3] int n = triangle.size();
阅读全文
摘要:题目: 思路: 【1】回溯的方式处理 代码展示: 进行优化: //时间0 ms击败100% //内存40.2 MB击败90.50% //首先做了范围判断免去无用的递归,其次,再遇到前导零的时候进行剪枝,但这种其实提高不了多少 //其次能变为0ms的原因主要是将StringBuilder 替换了 St
阅读全文
摘要:题目: 思路: 【1】动态规划的方式: 本质上和 剑指 Offer II 103. 最少的硬币数目(322. 零钱兑换) 这道题十分相似 类似于多少不同金额的硬币凑成了对应的钱 和我们这道选择数值,组合成对应的数值 那么选择的话就是对应的F(N) 如果是【1,2,3】,4 那么F(4) = F(4-
阅读全文
摘要:题目: 思路: 【1】使用树的回溯方式: 【2】动态规划(本质上是将每个位置的钱数都展示出来,方便当金额加上去后可以查找到没加该硬币时候的数量) 代码展示: 动态规划: //时间15 ms击败39.70% //内存40.7 MB击败90.50% //时间复杂度:O(Sn),其中 S 是金额,n 是面
阅读全文
摘要:题目: 思路: 【1】回溯的方式 代码展示: //时间4 ms击败12.21% //内存42 MB击败82.83% //时间复杂度:O(n×n!),其中 n 为序列的长度。 //空间复杂度:O(n)。我们需要 O(n) 的记录哈希表,同时在递归的时候栈深度会达到 O(n),因此总空间复杂度为 O(n
阅读全文
摘要:题目: 思路: 【1】回溯的方式: 【2】动态规划的方式: 记数组的元素和为 sum,添加 - 号的元素之和为 neg,则其余添加 + 的元素之和为 sum−neg,得到的表达式的结果为 (sum−neg)−neg=sum−2*neg=target 即 neg=(sum−target)/2 所以转变
阅读全文
摘要:题目: 思路: 【1】利用回溯的方式: 【2】非递归(字典序法)实现组合型枚举(未理解) 代码展示: 非递归(字典序法)实现组合型枚举的方式: //时间6 ms击败57.94% //内存42.8 MB击败45.2% class Solution { List<Integer> temp = new
阅读全文
摘要:题目: 思路: 【1】回溯的方式 【2】按括号序列的长度递归 任何一个括号序列都一定是由 '(' 开头,并且第一个 '(' 一定有一个唯一与之对应的 ')'。 这样一来,每一个括号序列可以用 (a)b 来表示,其中 a 与 b 分别是一个合法的括号序列(可以为空)。 那么,要生成所有长度为 2n 的
阅读全文
摘要:题目: 思路: 【1】借鉴 剑指 Offer II 081. 允许重复选择元素的组合(39. 组合总和)这道题。首先先从题目看会发现高度重合,区别在于,一个可以重复选,一个不可以重复选,其次是一个是去重的数组,一个是不去重的数组。那么改起来也很简单。 【2】先对数组进行去重,再进行回溯的方式 代码展
阅读全文
摘要:题目: 思路: 【1】回溯算法 + 剪枝的方式,一般而言这种最好是画出树形图,如candidates = [2, 3, 6, 7], target = 7 为例: 【2】其次,根据题目可知是组合(即 [2, 2, 3] 与 [2, 3, 2] 视为相同列表,这表示了我们要去重),去重的方式可以采用指
阅读全文
摘要:题目: 思路: 【1】动态规划的方式,首先对于动态规划的问题是分成子问题,那么子问题又可以当做是一个小汇总,如 对于 1≤i<n,第 i 号房子和第 i−1 号房子的颜色必须不同, 因此当第 i 号房子被粉刷成某一种颜色时,第 i−1 号房子只能被粉刷成另外两种颜色之一。 当第 i 号房子分别被粉刷
阅读全文