2022 年 03 月 07日

今天是否学习了算法训练营的内容?
答案:是。

学习时长:
2h

学习的主要内容如下:
1.链表的基础知识:单链表
2.反转链表
3.合并两个有序列表
4.反转链表II

遇到的问题:
Q:在合并两个升序单链表的过程中创建虚拟节点的问题:创建一个虚拟的节点,然后又定义了一个指针指向这个虚拟的节点, dummy = ListNode(1) pre = dummy.这里的dummy应该怎么理解,因为后面都是在用指针进行操作了,是相当于一个临时的变量的作用吗
A:虚拟头节点与后面的原链表头节点以及其它节点的地位是一样的,如果不设置虚拟头节点,在删除一个节点的时候就存在分类讨论的问题了:
– 如果是头节点,直接删除,后面的链表由于失去了指针,无法进行链表操作
– 如果是其他节点,直接删除就行了。
为了避免删除与合并过程中的分类讨论,通过设置虚拟头节点就可以解决。

学习感受:
由于对算法接触的少,自己语言方面也是采用的python语言,在听吴师兄的算法视频的时候会着重听思路和技巧,然后用python去复写出来,当然有些语法可能都还不是太熟练,所以基本上是在学习语法的同时还在巩固一些语法知识吧。借助图表可以有助于思考。


2022 年 03 月 08日

今天是否学习了算法训练营的内容?
答案:是。

学习时长:
2h

学习的主要内容如下:
1.环形链表:听完讲解并提交代码
2.带随机数指针的链表:听完讲解并提交代码
3.每日温度:听完相应的讲解,还需要再复听弄懂代码

遇到的问题:
每日温度遇到的两个问题:
Q1:这里构建一个数组来保存输出的结果:res = [0] * length
A1:相当于创建了一个一行,length列的数组,数组中的元素全为0
Q2:while stack and temperature > temperature[stack[-1]]:
如果栈顶元素存在并且当天的温度大于栈顶元素
这里貌似没有看懂这里的意思,文字描述的是两个条件,代码好像只能反应一个条件
A2:存疑
Q3:preIndex = stack.pop()这里有没有什么特殊的含义 ?
A3:这里默认的是移除栈(列表)的栈顶元素(最后一个元素的值),并返回新的栈(列表)。其实栈在python中也可以按照列表来理解。


2022 年 03 月 09日

今天是否学习了算法训练营的内容?
答案:是。

学习时长:
2h

学习的主要内容如下:
1.补充关于双端队列的基础知识
2.滑动窗口的题目
– 当前柱子高度小于或等于栈顶柱子的高度,形成洼地,直接入栈
– 当前柱子高度大于栈顶柱子高度,栈顶元素出栈,计算当前柱子和栈顶柱子之间的水的面积,再观察当前柱子和新栈顶柱子之间的关系
– 重复第二步,直到当前柱子的高度不大于栈顶高度或者栈为空
3.接雨水的题目
解题的本质:
– 将处于窗口的第一个数字删除,同时在窗口的末尾添加一个新的数字,可以用双端队列来模拟,每次把尾部的数字弹出,再把新的数字压入到头部,然后找栈队列中最大的元素。
– 如果队列中进来一个较大的数字,那么队列中比这个数字更小的数字就不可能再成为窗口中最大的元素了(这个大的数字是后进来的,一定会比之前早进入窗口的小的数字要后离开窗口,先进入且比较小的数字必然不可能成为最大的元素,可以弹出队列

遇到的问题:
Q1:在滑动窗口这一道题中:对遍历元素的一个判断的理解:
n = len(nums)
q = collections.deque()
res = []
if n 0 or k 0:
return res
for i in range(0,k):
while q and nums[q[-1]] <= nums[i]:
q.pop()
疑问如下:nums[q[-1]]:可以表示队尾元素吗,为什么不能直接用q[-1]来表示当前的队尾元素?
A1:这里的理解要结合代码进行分析,重点搞清楚,python的语法问题:
队列返回值:
一种方法是保存元素,另外一种方法是保留元素下标

Q2:要想找出当前窗口的最大值,如果是采用对窗口中的所有元素进行遍历,复杂度为O(k*n)的级别的理解?
A2:首先是对n个数组中元素遍历,然后是对滑动窗口的K个元素的最大值进行遍历的,两者叠加导致复杂度增加
Q3:在让滑动窗口移动的时候加入的判断语句是:如果队首元素和窗口最左边的元素相等,需要将队首元素抛出
while q and nums[q[-1]] <=nums[i]:
q.pop()
这里的判断条件不是很理解,写的是和上一个循环的判断是一样的,但是上面是用于判断当前考察元素与队尾元素的比较,此处是比较队首元素与窗口最左边的元素,nums[q[-1]]:表示的是队列的队尾元素,而nums[i]又表示的是:队列最右边的元素,然后紧接着下面的一个判断:
while q[0] <= i-k:
q.popleft()
此处q.popleft():表示的是将队列的队首元素移除
A3:由于是双端队列,是可以进行队尾和队首的弹出的,这里的表示没有问题
前面的判断:是针对还没有形成滑动窗口的时候,满足判断条件弹出队尾元素,否则加入队列形成新的队尾元素
后面的判读:是针对已经形成滑动窗口的情况,也是需要不断的比较当前元素与队尾元素的大小问题,只不过加入了一个判断,这个判断是要弹出一部分队头元素的。

2022 年 03 月 10日

今天是否学习了算法训练营的内容?
答案:是。

学习时长:
2h

学习的主要内容如下:
1.K个一组翻转链表(学习视频的内容以及相应的思路)
2.最小栈(结合栈的基础知识加深队栈的理解)
3.回顾递归的知识并加深理解和代码的复刻(主要针对的反转链表用递归法和迭代法的不同思路来求解的问题)

4.加深对滑动窗口题的理解(昨天有一些思路障碍,然后问题没有解决清楚的)

遇到的问题:
急需快速成长起来,刻不容缓

2022 年 03 月 11日

今天是否学习了算法训练营的内容?
答案:是。

学习时长:
4h

学习的主要内容如下:
1.学习排序的基础知识:冒泡、选择、插入、快速、计数以及归并排列
2.颜色分类
3.盛最多水的容器
4.两数之和:再一次理解哈希表也即python中的字典

遇到的问题:
Q1:在颜色分类这道题中,python对于swap函数其实是不需要进行定义,直接用类似于left,index = index来替换self.swap(nums,left,index)语句,并隐藏后面swap函数的定义,但是实际执行的时候并没有得出正确的结果。
A1:经过与吴师兄沟通和自己查阅有:”Python 不使用这种方式(swap(a, b))来交换a 和b的值。Python以引用方式管理对象,你可以交换引用,但通常不能交换内存中的对象值“在这题中,我虽然把指针交换了,但是对应的元素的值并没有进行交换,这点和c++是有区别的,所以还是老老实实的写一个swap函数,然后调用swap函数来交换left和right指针对应的值。
Q2:在盛最多水的容器这道题目中:在最后的移动左边的柱子以及移动右边的柱子的时候,我自己写,就用的双if,没有用if else,结果测试的还有一小部分通不过,从逻辑上说是没有问题的,不知道问题在哪里?

A2:经过沟通以及调试后发现这里双if的适用场景是:两个条件必须是不相干的,而if else是指条件互斥的时候。这里如果用双if的话会发现,第一个的结果会影响第二个的执行

2022 年 03 月 12日

今天是否学习了算法训练营的内容?
答案:是。

学习时长:
2h

学习的主要内容如下:
1.跳跃游戏:解题的关键:先让其跳到尽可能远的位置
2.最小的k个数组:(实际运用了快速排序的知识,后面自己也要用暴力解法来试试)
3.数组中的逆序对:(实际运用了归并排序的知识,后面自己也要用暴力解法来试试)

2022 年 03 月 13日

今天是否学习了算法训练营的内容?
答案:是。

学习时长:
4h

学习的主要内容如下:
1.强化几种排序的python的代码的复刻,并尽量形成自己的模板,后面尝试直接背一下,最好直接形成肌肉记忆。
2.学习二分法查找:只能用于数组是有序的,不论是递增还是递减
3.学习顺序查找法

2022 年 03 月 14日

今天是否学习了算法训练营的内容?
答案:是。

学习时长:
2h

学习的主要内容如下:
1。计算右侧小于当前元素的个数(同样也是采用归并排序的思路,较难,后面还要再次进行相应的回顾)
2.合并两个有序数组
3.有序数组的平方

学习感受:
这周的学习内容要比上周的内容上了一个档次,自己学起来也是有点吃力,其实也不指望能够每周把所有的题目都够学明白,关键是自己学东西的水平要和实际自己徒手写代码的水平真正能匹配起来,后来的只会越来越难,切记这两者的水平要同步提高,自己同时也一直在重视笔记整理的习惯,无论的简单的,还是复杂的都要燕过留痕。

2022 年 03 月 15日

今天是否学习了算法训练营的内容?
答案:是。

学习时长:
2h

学习的主要内容如下:
1.把最小的k个数组这道题用两者方法解出来(暴力解法+快递排序的解法)
2.再次巩固归并排序的知识:相对快速排序是一种稳定的排序
step1 分解:将原问题分解为若干个规模较小,相互独立,与原问题形式相同的子问题;
step2 解决:若子问题规模较小而容易被解决则直接解,否则递归地解各个子问题
step3 合并:将各个子问题的解合并为原问题的解。
将原始数组逐渐一分为二,直到不能拆分,最终得到单元素即为已经排序,然后进行合并两个已排序的子序列
时间复杂度:平均O(nlogn), 最坏O(nlogn), 最好O(nlogn)

2022 年 03 月 16日

今天是否学习了算法训练营的内容?
答案:是。

学习时长:
2h

学习的主要内容如下:
1.数组中的逆序对数(相当于是二次回顾了)
2、合并两个有序数组(二次回顾):用暴力解法(两层循环)+双指针写法(在题目给定的过程中,原先的两个数组就是有序的)

遇到的问题:
Q1:数组中的逆序对数这题中,对于python写法,之前写归并排序的时候,有一个返回,调用的merge函数,但是在写这题的时候没有单独把merge函数写出来?
A1:与吴师兄沟通后,这题代码是直接在归并排序的代码上改的,沿用的java排序的思想,这里我自己也理解了一下,merge函数写与不写无所谓(写了相当于做了一次拆分),本身这题不用去管merge是否有用

Q2:自己在写后面的循环的时候,用python写的并没有分到三种情况。
A2:其实思路一样,只是写法上稍微有区别

2022 年 03 月 17日

今天是否学习了算法训练营的内容?
答案:是。

学习时长:
2h

学习的主要内容如下:
1.计算右侧小于当前元素的个数
涉及知识点:归并排序计算逆序数+索引数组
整体感受:有点难,花了好长时间也没有吃透,自己要写几倍呢思路全无,即使是看完之后写思路也是乱的,还得周六再回顾
2.摆动数列(看完教学)
3.加油站(看完教学)

2022 年 03 月 18日

今天是否学习了算法训练营的内容?
答案:是。

学习时长:
3h

学习的主要内容如下:
1.分发饼干
2.加油站(回顾)
3.柠檬水找零
4.三数之和:关键点:如何去重的问题

2022 年 03 月 19日

今天是否学习了算法训练营的内容?
答案:是。

学习时长:
3h

学习的主要内容如下:
1.摆动序列
2.搜索插入值位置
3.在排序数组中查找元素的第一个和最后一个位置
4.搜索旋转排序数组
5.最接近三数之和

2022 年 03 月 20日

今天是否学习了算法训练营的内容?
答案:是。

学习时长:
3h

学习的主要内容如下:
1.二叉树前序遍历
2.二叉树中序遍历
3.二叉树后序遍历
4.二叉树层序遍历

2022 年 03 月 21日

今天是否学习了算法训练营的内容?
答案:是。

学习时长:
3h

学习的主要内容如下:
二叉树最最要的还是一个递归和一个迭代的概念,这其中衍生出来的,必须得把概念理清楚了,做题才不会混乱,自己还要加强对概念的理解。
1.相同的树
2.对称二叉树
3.二叉树的最大/最大深度
4.从前序与中序遍历构造二叉树
5.二叉搜索树的最近公共祖先

2022 年 03 月 22日

今天是否学习了算法训练营的内容?
答案:否。

2022 年 03 月 23日

今天是否学习了算法训练营的内容?
答案:是。
学习时长:
2h

学习的主要内容如下:
1.二叉树的最近公共祖先
2.路径总和
3.二叉树的右视图
4.二叉树的锯齿形遍历(沿用了层序遍历的思想)

2022 年 03 月 24日

今天是否学习了算法训练营的内容?
答案:是。
学习时长:
2h

学习的主要内容如下:
1.二叉树的最近公共祖先(直播回顾)
2.路径总和(自身总结与回顾)

在二叉树树的最近公共祖先这一题中的总结:
问题一:

写清楚递归的结束条件很重要:前面的这三个返回就是递归调用的出口,最后经过不断的递归,肯定都会从这三个出口出去,并且由于最终都是返回的root(本质上前面的三个出口,返回空,返回p和返回q都是返回root),最后root就是符合要求的最近的公共祖先。
问题二:

如果不是这三种情况的时候,其中第9和第10这两种情况,由于左右两边的深度不一样,导致有可能left(或right)最先发现不能找到p 和q,相当于是提前被拦截了,然后继续的递归调用right(left),直到9 10也到前面那三个递归的出口

在路径总和这一题中的总结:
问题一:

在原有的类中再创建一个新的函数的时候,有几个要注意的点:
1.self参数也要传入进去
2.定义node(正在遍历的节点)也要按照题目中给定的方式申明变量的类型:node:TreeNode,同理,value: int,targetSum: int,stack:[],path: []也要做相同的处理
问题二:

调用函数的时候,self要写在前面,而参数的内部则不需要写self以及相应的变量的类型申明(函数定义的时候已经进行处理过了)
问题三:

这里的递归调用是重点:不断的搜索当前节点的左子树以及右子树,直到找到所有满足条件的路径。

2022 年 03 月 25日

今天是否学习了算法训练营的内容?
答案:否。

2022 年 03 月 26日

今天是否学习了算法训练营的内容?
答案:是。

学习时长:
2h

学习的主要内容如下:
1.回顾反转链表II(再来写还是有点犯怵)
2.把二叉树的右视图这题的代码自己敲了一遍
遇到的相关问题的整理

注意这里的写法:levelSize = len(queue)代表每一层的节点总数,分别为1,2,3,4


这里弹出队列队首元素的写法:node = queue.popleft(),pop()函数是用于栈的

重点理解:当末尾节点就是这层中最右侧的节点的时候,把相应的节点值加入到arr中

2022 年 03 月 27日

今天是否学习了算法训练营的内容?
答案:是。

学习时长:
3h

学习的主要内容如下:
1.重点消化堆排序(说实话,真的有点复杂,虽然昨天是听了相应的直播课程的,真正自己来想的时候,发现哪哪都不对,还是基础不牢呀)

2022 年 03 月 28日

今天是否学习了算法训练营的内容?
答案:是。

学习时长:
1h

学习的主要内容如下:
1.重新回顾二分查找
2.寻找两个正序数组中的中位数(有点难操作)
3.有效三角形的个数

2022 年 03 月 29日

今天是否学习了算法训练营的内容?
答案:是。

学习时长:
1h

学习的主要内容如下:
1.寻找峰值
2.第一个错误版本
3.丢失的数字
4.2的幂

2022 年 04 月 03日

今天是否学习了算法训练营的内容?
答案:是。

学习时长:
2h

学习的主要内容如下:
1.子集
2.最大子序和
3.最小路径和
4.子集(循环的算法)
5.组合总数

2022 年 04 月 04日

今天是否学习了算法训练营的内容?
答案:是。

学习时长:
2h

学习的主要内容如下:
1.零钱兑换
2.编辑距离
3.股票系列问题

2022 年 04 月 06日

今天是否学习了算法训练营的内容?
答案:是。

学习时长:
2.5h

学习的主要内容如下:
1.股票系列问题
2.三角形路径和
3.不同路径
4.不同路径II

2022 年 04 月 07-11日

这几天兜兜转转,主要就是在解决一系列的动态规划+回溯算法的问题(看了很多,写了一些,还没有完全吃透),越到后面,学习的动力反而不足,思考的更少了,有时甚至是不想思考。值得反思,要形成自己的思维模式和模板,哪里有问题就尽快的去解决。
1.再次回顾斐波那契数(层层的从暴力递归—递归+备忘录—动态规划—空间优化)
2.零钱兑换问题(层层的用递归–动态规划的一个推导过程)
3.打家劫舍系类问题(分析两种情况的区别:II是一个环,切割后就变成I问题)
4.最大子数和问题
5.子集系列问题(在代码层面没有完全弄懂,里面涉及好几种解决)
6.组合问题(其实也是和子集问题相同)
7.最小路径和(相对简单的一题)
8.整数拆分(为什么要拆分成两种情况以及相应的证明过程[只能说暂时记住了结论了])
9.分割等和子集
10.不同路径I/II(有障碍+无障碍)
遇到的相关问题的整理
针对打家劫舍II成环的问题的讨论以及里面涉及到一些细节、边界、数学证明问题

2022 年 04 月 12日

今天是否学习了算法训练营的内容?
答案:是。

学习时长:
4h

学习的主要内容如下:
1.昨天没有弄懂的子集问题,今天弄懂,回溯算法的模板真好用,细节把控以及用循环的方式来解题
2.组合问题,代码实操层面
3.剑指offer03-数组中重复数组
4.剑指offer04-二维数组中查找
遇到的相关问题的整理

很基础的问题:涉及到数组的拷贝问题

2022 年 04 月 13日

今天是否学习了算法训练营的内容?
答案:是。

学习时长:
3h

学习的主要内容如下:
1.回顾岛屿问题
2.回顾N皇后问题
3.排列
4.全排列II

2022 年 04 月 14日

今天是否学习了算法训练营的内容?
答案:是。

学习时长:
3h

学习的主要内容如下:
1.替换空格(用两种方法)
2.用两个栈实现队列(概念题),并同时回顾了leetcoad232用栈实现队列
3.从头到尾打印链表(采用栈的方式+采用递归的方式)
4.斐波拉契数列
5.青蛙跳台阶
6.旋转数组中最小数字
7.矩阵中的路径
8.机器人的运动范围

2022 年 04 月 15日

今天是否学习了算法训练营的内容?
答案:是。

学习时长:
2h

学习的主要内容如下:
1.删除链表的结点
2.调整数组顺序使奇数位于偶数前面
3.链表中倒数第k个节点
4.反转链表
5.合并两个有序链表

2022 年 04 月 16-17日

今天是否学习了算法训练营的内容?
答案:是。

学习时长:
6h(合计)
学习的主要内容如下:
1.树的子结构
2.二叉树的镜像
3.对称二叉树
4.实现Trie(前缀树):有点难,而且延申的习题没有掌握,概念看起来并没有完全吃透
5.并查集的基础知识
6.哈希表的基础知识(python的实现方向)
7.把矩阵中的路径那道题按照之前群里讨论的方式重新归纳和debug了一遍