获得徽章 0
被leetcode吊打第十四天:二叉树前序的非递归前后遍历
前序的非递归
使用栈的结构来处理。由于栈是后进先出的。因此对于前序遍历(中左右的情况),我们放入栈的时候,应该是根节点先加入栈,然后弹出。对于其左右的子节点,应该为先将右节点放入,再放入左节点。
所以我们只需要定义一个栈、一个存放节点值的数组即可。
后序的非递归:
与前序类似,我们的前序是将中左右的值存入数组,对于子节点的操作,我们是先放入右节点,后放入左节点这样栈内就是先为右子树,后为左子树
那么后序,我们将前序的节点值的数组反转一下,就是右左中的值,离我们的左右中的顺序就是子树进栈的顺序不同。因此将前序的左子节点入栈和右子节点入栈顺序换一下即可。
展开
评论
二叉树的先、中、后序遍历的迭代实现
我们在迭代前,需要知道我们迭代结束的条件是什么:
当前节点为空的时候,return。
而我们的root指向的是某个具体的节点。拿后序来说,也就是到某个节点的左/右节点为空的时候,递归才会回退一步,指向后面的将这个节点的值push进数组
var postorderTraversal = function(root) {
const roots = [];
const dfs = function(root){
if(root === null){
return;
}
dfs(root.left);
dfs(root.right);
roots.push(root.val);
}
dfs(root)
return roots;
};
展开
评论
被leetcode吊打第十二天:四数之和
该题与三数之和类似,
四数之和的双指针解法是两层for循环nums[a] + nums[b]为确定值,依然是循环内有left和right下标作为双指针,找出nums[a] + nums[b] + nums[left] + nums[right] == target的情况
但是有一些细节需要注意,例如: 不要判断nums[k] > target 就返回了,三数之和 可以通过 nums[i] > 0 就返回了,因为 0 已经是确定的数了,四数之和这道题目 target是任意值。组是[-4, -3, -2, -1],target是-10,不能因为-4 > -10而跳过
此外,内层循环的break和return的使用也需要注意,不能用return,而是用break
展开
评论
被leetcode吊打第十一天:三数之和,梦破碎的地方。
最开始想的是类似于两数之和的方法,算num1+num2的和,再对其和num2用map,但是去重太麻烦了,之间报错。后续看了题解发现需要使用双指针的方式
首先将数组排序,然后有一层for循环,i从下标0的地方开始,同时定一个下标left 定义在i+1的位置上,定义下标right 在数组结尾的位置上。
我们的思想就是先定一个i,然后找left和right,然后再找这个i对应的所有的
移动left 和right:
如果nums[i] + nums[left] + nums[right] > 0 就说明 此时三数之和大了,因为数组是排序后了,所以right下标就应该向左移动,这样才能让三数之和小一些。
如果 nums[i] + nums[left] + nums[right] < 0 说明 此时 三数之和小了,left 就向右移动,才能让三数之和大一些,直到left与right相遇为止。
对于去重我们可以理解为固定两个后,对第三个进行去重。
i 的 去重:判断i左侧的(也就是在三元组里出现过的),如果遇到一样,那也就是说这个值对于i已经用过了,直接换成下一个值。
left和right的去重:是为了防止我们找到了一个三元组后,(此时固定了 i 和 left/right),后续三元组的right/left 值和之前的一样。因此对于left需要循环判断left与left右侧的元素是否相等,对于right需要判断right与right左侧的元素是否相等
展开
评论
被leetcode吊打第十一天,239. 滑动窗口最大值
该题我们可以使用单调队列,即单调递减或单调递增的队列。与优先级队列不同处在于:如何维护元素里的单调增和单调减(也就是说这个队列其实是我们diy出来的)
针对不同的题目单调队列的处理也不同。
在该题中,我们的单调队列(单调减的)只需要维护可能成为最大值的元素(不需要维护整个窗口)。也就是让出口处始终为滑动窗口当前的最大值元素。
pop(value):如果窗口移除的元素value等于单调队列的出口元素(也就是此时窗口的最大值),那么队列弹出元素,否则不用任何操作(因为其他元素已经在push的时候被我们移出队列了)
push(value):如果push的元素value大于入口元素的数值,那么就将队列入口的元素弹出,直到push元素的数值小于等于队列入口元素的数值为止
而我们要push、shift的value,就是滑动窗口移动的过程中,nums应该加入、移出滑动窗口的元素。
展开
评论
被leetcode吊打第十天 20.有效的括号
对于这种匹配问题,使用栈的方式更好,
其中我们在遇到左括号的时候,将其匹配的右括号入栈。
在遇到右括号的时候,将栈顶元素弹出,判断弹出的元素是不是等于字符串当前的元素。
同时由于左右括号数量可能不同,因此我们还需要在最后判断栈是否为空的情况。
此外,在开始的时候我们可以加一个判断,如果字符串的长度不是偶数,那么直接返回false。
展开
评论
被leetcode吊打第九天:用栈实现队列
我们可以使用两个数组的栈方法(push, pop) 实现队列
* push():栈一样
* pop():输出的时候,我们需要判断输出栈是不是为空,如果是的空话,将输入栈的元素全部填充至输出栈中,再进行输出。如果不是,则直接输出
这里需要注意的是,不能用for循环,因为我们对输入栈一直使用pop,其长度每次循环都在减少!
* peek():我们可以复用pop(这里直接用this,而不是this.stackOut),也就是将队首元素弹出来获取,再返回出去(记得将它重新加进去 这里为this.stackOut)
* empty():判断两个栈是否都为空
展开
评论
小跨计算机的前端菜鸡
被leetcode吊打第八天:环形链表 II
1.判断有环的方式:用快慢指针的方式(快指针每次走两步,慢指针走一步),如果他们相遇,则该链表有环。
为什么快指针每次走两步?因为这样快指针相对于慢指针,是每次走一个节点。这样快指针就不会错过慢指针。(实际就是在环中慢指针一步一步追赶快指针的过程)。
2.如何找到入口?
我们假设起始位置距入口处为x(也就是我们要求的);入口处到相遇位置的距离为y,相遇位置再到入口处的距离为z
由于快指针是一步一步追赶慢指针的,因此当慢指针进入环内后,最多只会绕着环走一圈然后被快指针追上(也就是说慢指针在环内不会走两圈)
所以,慢指针移动的距离就是: x + y
而此时快指针可能在慢指针进入环内时已经在环内走了 n 圈了,
所以快指针移动的距离为:x + n (y + z)+ y n>=1
又因为,我们的快指针每次走的距离是慢指针的两倍。所以就有
x + n (y + z) + y == 2 (x + y)
根据这个得出 x 就是我们要的答案 x == n (y + z) - y == (n - 1)(y + z) + z
当 n ==1 时, x == z 通过这个等式,我们可以理解为,在头节点处定义一个指针index1,在相交的位置定义一个指针 index2 ,他们同时移动,indexi2 转了很多圈后与index1 相遇的位置就是入口处。
展开
评论
被leetcode吊打第七天 KMP算法
前缀:包含首字母不包含尾字母的所有子串
后缀:包含尾字母不包含首字母的所有子串
最长相等前后缀:也就是前缀和后缀相同时,前缀/后缀的长度。
例如 aabaaf
a 0
aa 1
aab 0
aaba 1
aabaa 2
aabaaf 0
而前缀表就是这个数字序列
aabaaf
010120
当我们不匹配的时候,就需要找冲突的元素前面的最长相等前后缀,然后将模式串往后移动这个长度,继续匹配
展开
评论
被leetcode吊打第六天
2-两数相加
我们可以先交换头指针,使得一个指针始终指向长的那个链表,便于我们判断循环结束的条件。
然后进行相加的操作,针对短链表有两种情况:
1:短链表当前结点是空的情况
2:短链表当前结点非空的情况
并在循环中操纵指针来创建结点并存入新链表中

最后由于我们循环中的链表长度是等于长链表的长度的,但是可能存在进位的情况,因此我们判断进位符是否为空,不为空则单独创建一个结点插入。
展开
评论
被leetcode吊打第5天。
这次选了个简单的题,找找自信。剑指offer 58-左选择字符串
这个题目想在原地反转的话,可以分为两步:先整体反转,然后再将length - 1 - n左右的字符串分别反转即可。
评论
被leetcode吊打2小时的第三天....
151.反转字符串中的单词。
该题整体思路可以分为三步,
1、先不考虑单词里字母的顺序是否相同,而是先让单词顺序和目标字符串相同
这个时候的做法就是直接反转整个字符串。
2、移除空格
3、此时就是单词里的字母不同,因此再对每个单词做反转即可!
注意传入的数组为一直为原数组,否则索引会有问题

其中,难点在于空格的移除。
移除空格可以使用双指针的方法(类似于数组中移除元素的方法)
快指针获取符合我们要求的字母
慢指针则是标记获取到字母后更新在哪里。

此外,单词之间的空格也需要处理下,也就是当慢指针不是起始位置且快指针指向单词首字母的时候,慢指针先移动(留出一个空格的位置)然后再让快指针指的字母赋值到慢指针的位置上。
展开
评论
leetcode第三天:剑指 Offer 05. 替换空格
这个题目,需要先将数组的长度扩充(js中好像不需要...)然后从后往前遍历,依次移动元素。遇到空格就将%20进行填充,如果没有空格,则移动元素。
评论
学习数据结构和leetcode第二天:541.反转字符串
本题需要三个指针:反转字符串需要两个指针 i 和 j ,同时确定开始反转的位置也需要一个 start,
start每次指向下一个 2 * k 的位置,让反转从此开始。
j 指针的位置每次指向start后面的 k 个元素。在这里需要判断一下后面的元素是否有 k 个,如果没有,让 j 直接指向最后一个元素即可。
展开
评论
下一页
个人成就
文章被点赞 9
文章被阅读 6,802
掘力值 214
收藏集
0
关注标签
0
加入于