夏冰的学习笔记
工作快一年才意识到代码能力的重要,决心忘记大学的知识,重新刷一下题(leetcode)。。为考研做一下准备。
我的计划是从简单到困难,其间总结一下做题的套路,坚持下来就是胜利,加油。
2021 03.30 今日目标:简单题----4道
没想到第一题就卡住了 ,可能是数据结构已经忘记的差不多了,所以需要复习数据结构的知识
有效的括号 ----- 这一题采用的数据结构是栈和哈希表 具体用字典来对应 以后的解题思路可以参考下面的这位大佬
观察大佬的思路,就是先用算法思路,找到对应的数据结构,然后根据这个思路走流程,正常流,最后考虑
边界的问题,顺带分析时间和空间复杂度。
实际解决的代码如下:
来一步步分析,首先用字典建立好键值对,然后用栈,python语言其实并没有封装好的栈,但是我们可以用
列表来模拟栈的先进后出,如上图,首先stack=['?'],就是列表的方式,但是后续 如果给定的字符串的字符在字
典中,就加入栈,如果不在栈中且在栈顶对应的值并不相等,就返回false
如果最后这个栈的长度是1,也就是说,整个栈只剩下一个?的时候是全部匹配到了,返回true,否则返回false(这里是
考虑到了全是左括号的字符串)
接下来是21题 合并两个有序链表
根据以往的经验,遇到这种合并的题目,一般用递归比较方便,思路也比较好捋清
这个题目,我的思路是将一条链表作为基准,另一条链表排序插入,这样可能时间复杂度较高233
暂时先不考虑边界值,按照正常的流程来走:
1 判断给定的链表那个初值更小,将其作为基准
2 另一条链表继续跟第一条链表的第二个值相比较,如果比这个值大,就继续(递归),如果比这个值小就插入中间
3 然后将后面那条链表的第一个结点去掉,将第二个结点作为首结点,继续递归
边界值的情况:
其中一个链表为空,在函数最前面进行判断,为空则返回值为另一个链表
时间复杂度:O(m+n)
空间复杂度:O(m+n) m、n分别为两条链表的长度
具体的代码:
这里两个链表为空是可以判断的(注意:python是没有null的,判断是否为空,可以用none)
看了这个大神的代码,发现我自己的思路转变为代码还是有一点瑕疵,我写代码卡在如何继续递归,还需要做别的插入操作吗,
而看了大神的操作,就能明白,只要一直递归到底就行。看上面代码,大神的分析如下:
那我的思路跟他的思路相比就会复杂一些,可能还要申请新的指针来存储一个结点和一个,可以说是半递归,他的方法就直接到最后一步
最重要的是,递归是层层返回的,因此并不需要再新建一个指针或者链表,直接接上就可以,如上图的:
l1.next = self.mergeTwolists(l1.next,l2) return l1
这里的意思就是l1.next接上后续的比小结果,一直到有一个为空,层层返回,就连接成一个链表,最后返回 l1即可
这个题目虽然很基础但是值得反复回味与复习
接下来下一题
22 括号生成
本题的题干是生成有效的括号,首先我们要找到括号的规律,
在题目中看到这些括号的规律是一定要闭合,且有序
这个题干让我想起了,第一题判断有效的括号组合,类比第一题,这个题目应该也是要用到栈的
n代表括号的对数,也代表左右括号的个数,我们可以用0代表左括号,1代表右括号,也就是说,这是n个0和n
个1 的排列组合,但是这个组合需要遵循一定的规律
由于自己思考太久都没有想法,这里就直接贴上大神的想法了。
没想到用到了深度优先和广度优先,而且数据结构也并不是栈,而是树
这里是采用深度优先遍历,并且分析题干意思,是直接将剩余括号数量作为判断的依据,然后
产生分支,并且将不符合规则的分支减掉即可,具体的代码如下:
我们来逐步分析这个代码 首先,结束条件:如果可用的左括号以及右括号都为0,那么一种情况已经算出来来,将其
放入列表中,如果右括号剩余的数量小于左括号的数量,这个结论是在画出二叉树得到的,也就说,没有右括号能跟左括号匹配
了,这种情况也需要返回(也是图上说的剪枝)
之后对左括号右括号的剩余数量进行判断,如果还有剩余,那么括号的数量减一,并继续递归下去
看完这个题目的解法之后,我的想法就是,需要回去复习深度、广度优先的算法了。这个列在日程中。
接着下一题:
7 整数反转
这道简单难度的题目,真的非常简单。。 直接用暴力破解法解决了这个问题,其中涉及到string以及int类型的相互转换,
还有string 的切片函数,以及python的指数函数等等。这些都是需要时常复习的。以下是我的代码。
可以看看大神们是怎么写的,规范一下自己的代码,整理一下思路
大神们都没有考虑用str和int相互转换的思路,而是统一用了数学的思维(是我想的太少了,汗。。),以下是大神的思路:
我来捋一捋这个思路,就是
继续做题,9. 回文数
这题我打算用整数转字符串以及数学的两种方法来解决。首先是字符串,没什么好说的直接上代码
字符串的解法:
数学的解法 如下:
中途碰到的问题就是,没有将x/10 强制类型转换一下,这样得到的也是整数
就先做到这里,之后的题目在后面的文章继续记录。