![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
LeetCode
文章平均质量分 83
洋间
你好玛卡巴卡
展开
-
LeetCode回溯算法——代码随想录
回溯法也可以叫做回溯搜索法,它是一种搜索的方式,回溯是递归的副产品,只要有递归就会有回溯。回溯法解决的问题都可以抽象为树形结构,因为回溯法解决的都是在集合中递归查找子集,集合的大小就构成了树的宽度,递归的深度,都构成的树的深度。递归就要有终止条件,所以必然是一棵高度有限的树(N叉树)。大家可以从图中看出for循环可以理解是横向遍历,backtracking(递归)就是纵向遍历,这样就把这棵树全遍历完了,一般来说,搜索叶子节点就是找的其中一个结果了。一般模板如下:时间复杂度子集问题分析:排列问题分析:组合原创 2023-06-09 13:41:12 · 264 阅读 · 0 评论 -
LeetCode二叉树——代码随想录
二叉树三种深度遍历递归144.前序遍历class Solution { public List<Integer> preorderTraversal(TreeNode root) { List<Integer> ans = new ArrayList<>(); traversal(root,ans); return ans; } private void traversal(TreeNode原创 2023-05-26 21:40:49 · 274 阅读 · 3 评论 -
Java中的栈和队列
Vector是动态数组,而Stack继承与它!Vector因为顶层设计原因,继承他的Stack会暴露get/set/add等方法,失去了面向对象的封装的意义。用户可能会有意无意地调用这些操作,这将成为软件工程中重要的 bug 来源。所以栈一般采用Deque,但它是,所以最好自己定义接口再做一层封装,屏蔽其他方法。在多线程方面,Vector实现了线程安全,效率比较慢不如ArrayList动态数组,多线程情况下也不推荐使用而是用 java.util.concurrent 包下的数据结构替代。原创 2023-05-16 20:28:18 · 139 阅读 · 0 评论 -
LeetCode数组——代码随想录
当用它作为算法的最坏情况运行时间的上界,就是对任意数据输入的运行时间的上界。递归算法的时间复杂度本质上是要看:。**那么思考一下 什么时候空间复杂度是 O(logn)呢?递归 **相当于从头加,用first和second来记录当前的两个数值,而不是重复计算同样的值。时间复杂度为O(2^n),大量重复计算。空间复杂度就是O(n)。(递归深度为O(n))原创 2023-05-16 19:50:23 · 76 阅读 · 1 评论 -
LeetCode链表——代码随想录
还可以利用环的性质,如果存在环,则一快一慢指针向后遍历一定会在环中相遇,而相遇的点与环的入口存在关系,如下图所示,(x + y) * 2 = x + y + n (y + z),则可以得到 x = n (y + z) - y 或 x = (n - 1) (y + z) + z,表示如果一指针从头节点走,一指针从相遇点走(步长都为1),则一定会在入口相遇,即可得到环的入口节点。,让两指针遍历完自己的指针后在遍历对方的,如果相交,则在交点相遇,如果不相交,则返回null。时间复杂度O(n),空间复杂度O(n)原创 2023-05-16 20:06:09 · 75 阅读 · 0 评论 -
LeetCode栈和队列——代码随想录
分两个循环走,一样//解法一 //自定义数组 class MyQueue {//弹出元素时,比较当前要弹出的数值是否等于队列出口的数值,如果相等则弹出 //同时判断队列当前是否为空 void poll(int val) {if(!} } //添加元素时,如果要添加的元素大于入口处的元素,就将入口元素弹出 //保证队列元素单调递减 //比如此时队列元素3,1,2将要入队,比1大,所以1弹出,此时队列:3,2 void add(int val) {while(!原创 2023-05-16 20:37:38 · 114 阅读 · 0 评论 -
LeetCode字符串——代码随想录
如果 s[i] 与 s[j + 1] 相同,那么就同时向后移动i 和j 说明找到了相同的前后缀,同时还要将j(前缀的长度)赋给next[i], 因为next[i]要记录相同前后缀的长度。如何判断在文本串s里出现了模式串t呢,如果j指向了模式串t的末尾,那么就说明模式串t完全匹配文本串s里的某个子串了。那么 s[i] 与 s[j+1] 不相同,就要找 j+1前一个元素在next数组里的值(就是next[j])。因为j初始化为-1,那么i就从1开始,进行s[i] 与 s[j+1]的比较。原创 2023-05-16 20:21:58 · 91 阅读 · 0 评论 -
LeetCode哈希表——代码随想录
这个方法就是我们常说的「双指针」,当我们需要枚举数组中的两个元素时,如果我们发现随着第一个元素的递增,第二个元素是递减的,那么就可以使用双指针的方法,将枚举的时间复杂度从 O(N2) 减少至 O(N)。这是因为在枚举的过程每一步中,「左指针」会向右移动一个位置(也就是题目中的 bbb),而「右指针」会向左移动若干个位置,这个与数组的元素有关,但我们知道它一共会移动的位置数为 O(N)均摊下来,每次也向左移动一个位置,因此时间复杂度为O(N)。时间复杂度O(n^2) ,空间复杂度O(n)。原创 2023-05-16 20:09:14 · 91 阅读 · 1 评论 -
生成素数表,判断素数的方法
从i*i 开始是因为它之前的合数 i * (2 ,3,…, i-1)已经被2 ,3,…, i-1算合数时筛选过了。(比如 18 = 2 * 9,prime[j]是最小质因数,i在其中充当倍数的作用)把所有素数的倍数筛去,O(nloglogn),问题是一个合数可能被多次筛选。从 2 ~ n^(1/2),一个一个试。prime[j] * 最大。i 筛一次,O(n),牛。所有合数只被自己的 最小。原创 2023-05-16 19:18:10 · 92 阅读 · 1 评论