一个算法笨蛋的11月leetCode刷题日记
时间
情况
2021年10月29日
时隔一年,第三次重做反转链表,又没做出来,太废了。
2021年11月1日
时隔两天,第四次重做反转链表,轻松写出
【21】合并两个有序链表(思路:想象两个有序链表,需要新建两个next指向头节点的空node,一个用于最后返回.next,一个用于接收最小的node)
【206】反转链表(思路:想象一个单链表,需要创建一个与头结点相识的cur结点进行遍历,创建一个用于保存新的链表的prev空结点,以及一个临时保存cur的中间结点)
【83】删除排序链表中的重复元素(思路:想象一个排序链表,定义一个与head引用相同的cur结点,cur与cur.next比较,相同则cur.next = cur.next.next,否则继续遍历)
【141】环形链表(思路:使用快慢指针,不成环就必然会出现快指针的next是null,退出循环,返回false )
2021年11月2日
【161】相交链表(思路:由于不能改变链表结构,所以注意遍历到末尾使用赋值法,别通过pA.next = headB的方法进行交换链表遍历,会导致死循环。不相交的情况下,pA,pB都为空时退出循环)
【203】移除链表元素(思路:非常简单,思路也非常清晰,定义一个prev结点,是一个next指向head的空结点,再定义一个空节点cur,prev赋给cur,遍历cur,相同则cur.next = cur.next.next,否则继续遍历)
【234】回文链表(思路,使用快慢指针找出中间结点temp,然后利用栈实现temp后的结点从尾到头遍历,并与头结点遍历的值比较,一旦出现不同就为false,否则正常返回true)写了好久…
2021年11月3日
【237】删除链表中的结点(思路:由于只提供了一个要删除的结点,所以可以通过将当前结点的下一个结点的值赋给单前结点,然后删除单前结点的下一结点即可,两行代码可搞定)
【705】设计哈希集合(思路:利用LinkedList进行操作,构成hashset结构,自定义hash算法。 不熟练,看答案做的)
【706】设计哈希映射(思路:跟设计哈希集合一样,不过之前数组中存的是int类型,现在是存的一个新建的带有key和value两个字段的实体类。。不熟练,看答案做的)
【876】链表的中间结点(思路:做过最简单的链表题,包括写代码及测试的时间用时两分钟,使用快慢指针即可,太简单了)
【1290】二进制链表转整数(思路:由于二进制是从尾到头进行指数运算再分别相加的,所以先反转链表,再使用Math.pow()方法进行指数运算)
【2】两数相加(思路:时隔半年,满打满算已经是第四次做了,可是刚打开题目还是一脸懵,一丁点思路都没有,太废了。注意别陷入误区,直接相加就行,不用反转链表,注意在循环外定义变量保存进位。还有就是循环条件是l1 != null 或 l2 !=null)
【19】删除链表的倒数第n个结点(思路:使用快慢指针法。创建空指针,其next指向head,并创建快慢指针,分别赋值为head。快指针先走,快指针每走一步,记录步数,步数大于n时,慢指针开始走,快指针的next为空时,慢指针就在倒数第n+1个结点)
【24】两两交换链表中的结点(思路:递归恐怖如斯,看完题目后苦思冥想想不出来,老是感觉无法返回头结点,看了官方答案,使用递归居然5行代码解决。只能说我对递归还是太陌生了,不会写递归,太废了)
2021年11月4日
【61】旋转链表(思路:虽然最后自己磕磕碰碰做出来了,但是花费了40多分钟,由于要考虑太多边界条件了,而且感觉一点都不简洁,非常不优雅,太废了。思路就是先找出倒数第k-1个结点,然后把第k个结点摘除出来,将摘除出来的链表的尾结点的next设置为head,并且将k-1结点的next设置为null即可。其实就是将[1,2,3,4,5]链表中的[4,5]摘除,放到[1,2,3]的前面,变成[4,5]->[1,2,3])
【19】删除链表中的重复元素‖(思路:太废了,又是做不出来,看了答案,简直牛皮,直接通过一个head结点推导全部过程,通过递归及双重while循环判断,完美实现,拜服。)
【86】分隔链表(思路:思路非常简单,将小于 x 的结点放到同一个链表,将大于等于x的结点放到另一个链表,最后两个链表合起来就ok了。虽然做出来了,但是没注意审题,耗时较长,唉,太废了)
2021年11月5日
【19】反转链表‖ (思路:我一开始的思路就是先定位到要反转的前置和后置结点,并截取出来,然后对截取出来的链表进行反转,最后在拼接;奈何代码表达能力不行,最后有些边缘测试示例无法通过,遂求助于题解。太废了)
2021年11月6日
周末,休息
2021年11月7日
周末,休息
2021年11月8日
上午仔细复习了一遍上周所写的所有算法题,发现基本100%都可以见题脑海中就浮现思路,90%可以在脑海中编码出来详情,看来上周坚持上班路上在脑海中写一遍前一天的算法,下班路上脑海中写一遍当天的算法,是非常有用的。
【109】有序链表转换二叉搜索树(思路:就是一个循环对链表找中间结点,然后分割的一个过程,最后无法再分时,组装起来的就是一个树了,重点就是如何通过递归进行循环找中间结点,并创建对应树结点,并按规则赋给树的左右子结点。找中间结点的算法也有点不同,需要传入left和right两个结点,而不是平常的传入head结点)
【138】复制带随机指针的链表(思路:有个嘚的思路,看了题目以后,一分钟内完全一丝一毫思路都没有,就直接看题解了,最后发现第一个题解使用递归解决,我脑子不够用,无法理解。第二个题解不使用递归,我才慢慢看懂了思路。思路就是先不管随机指针,复制每个节点并拼接在被复制节点的后面;然后再从头遍历,将拥有随机指针的cur节点的next节点,指向cur节点的随机指针的next节点;最后就是分隔成两个链表,这一步较难,建议看题解)
2021年11月9日
【142】环形链表‖(思路:太简单了,虽然我的答案运行速度和所使用内存空间大小不太理想,但是实在是太快了,一步到位。我的思路就是通过hashMap,没遍历一个就存入map中,只要cur不为空,就一直遍历,如果遇到map中已存在的key,就直接返回cur即可,太简单了)
【143】重排链表(思路:使用快慢指针找到中间结点,分割链表,将后一个链表反转。将前一个链表与反转后的链表进行依次连接即可。啊啊啊,好气啊,我的思路与题解完全一样,就是在最后连接链表的时候出了问题,以及没有将前一个链表的尾结点的next置空。好气啊,就差一丝丝。写了几十行代码,基本都和题解一样,最后却没做出来。气啊!!还有第二种方法:将链表存进线性表中,可以通过下标访问,只需要一个从头i++获取,一个从尾j- -获取并连接就行,更简单。)
2021年11月10日
【147】对链表进行插入排序(思路:我的思路是一点毛病没有啊,通过双重遍历,先遍历获取原链表的结点cur,再将该结点通过对新链表进行第二重遍历查找插入的地方。唯一需要注意的两点就是,其一不要直接取cur结点,而是new一个结点将cur的值赋给新结点,否则会带上cur后的所有结点。其二第二重遍历中,找到插入的地方后记得break跳出第二重循环。)
【148】排序链表(思路:由于题目限定了时间复杂度为nlogn,所以排序算法就只能选择归并排序、堆排序、快速排序了。由于归并排序是最适合链表的,所以使用归并排序。思路是先找使用快慢指针找到链表的中间结点,然后分割成两个链表,再通过递归对左右两个链表进行继续分割。通过分割后返回的left结点和right结点进行合并两个有序链表操作)
2021年11月11日
【328】奇偶链表(思路:老实说,我觉得这题不配medium难度,实在是太简单了,用时三分钟,一次过,离谱,思路贼简单,分别定义两个新链表的链表头odd、even,以及用于最后返回和拼接的赋值结点odd2和even2。对head进行遍历,通过定义的num进行计数以及通过对num取余判断是奇数还是偶数,分别添加到odd和even中,最后拼接即可,太简单了)
【382】链表随机结点(思路:没做出来,虽然思路有,也很简单可以实现,但是超过了题目的要求,一次遍历,而我的思路需要进行两次遍历。看了题解,鬼斧神工,简直让我大开眼界,这算法让我想一辈子可能都想不到,反直觉。题解的代码非常简单,主要是思路,目的是确保每一个结点被选中的概率相同,也就是m个结点的链表,每个结点有1/m的概率被选中。但是按照我一开始的思路,就先要遍历链表获取链表长度m,然后通过random.nextInt(m)获取一个随机数n,然后再遍历链表获取第n个结点的val,遍历了两遍链表。题解的思路我解释不了,自己看题解去吧!!!)
2021年11月12日
【172】交换链表中的结点(思路:怎么说呢,有两种方法,第一种是交换两个结点,第二种是交换两个结点的值;奈何我脑子瓦特了,脑子里就想着第一种交换结点。而实际上,第二种比第一种简单的多,不需要考虑那么多特殊情况,最后特殊情况处理不好,导致部分测试用例不通过,就GG了,最后使用第二种轻松解决。)
【725】分隔链表(思路:没做出来,难受,明明脑子里是有思路的,但是就是无法通过代码表达这复杂的逻辑,归根到底应该还是我的思路不够全面,所以没做出来。做法就是先遍历一遍获取链表总长度,再通过取余和相除分别获取多余的结点数,和分割后每段链表的最小长度。再通过双重for循环进行分割)
【430】扁平化多级双向链表(思路:就是一个非常直接的思路,不就是有分叉就先连接分叉,分叉再连接主干,最后成为一条没有分叉的链表。是我想复杂了,又没做出来,不过能够看懂题解,理解题解,也还行,慢慢来,思路会越来越清晰的)
2021年11月13日
周末,休息
2021年11月14日
周末,休息
2021年11月15日
【817】链表组件(思路:我们只需要遍历一遍链表即可,将数组中的值放入hashSet中,通过contains()方法判断是否为一个组件的尾结点,也就是当前结点的值在set中,而下一节点的值不在set中,那么当前结点的值就是一个尾结点,代表一个组件。懂得思路后,代码写起来非常简单)
【707】设计链表(思路:每次遇到什么设计链表啊,设计哈希映射啊,设计哈希集合啊,设计栈啊什么的,我就特别烦,唉,没做出来。我凭感觉写的几十行代码运行后可以通过第一个测试用例,但是一提交就报空指针,也不知道是哪里出问题啊。最后看题解,感觉自己写的跟题解写的就不是一个东西,无爱了,弃了弃了。太废了)
【1019】链表中的下一个更大结点(思路:非常简单吧,第一步遍历链表将结点的值存入一个list中,记录list的大小。第二步list转数组,通过双重for循换,进行简单大小判断,即可返回最终数组,太简单了)
【1171】从链表中删去总和值为零的连续节点(思路:很遗憾,我没做出来,太废了。我的逻辑思维没有想通,如何使用代码删除相加为零的所有结点,卡在这里导致一直无法写下去,最后看题解,才懵懵懂懂了解了,通过双重循环中的外循环加一个if判断,如果遍历结点为空,则前置结点继续遍历,否则判断为找到了相加为零的结点,无需后移。好吧,滚去看代码吧,我这无力的表达能力)
【1367】二叉树中的列表(思路:菜逼石锤了,太多条件判断了,没做出来,是我菜了,只要涉及到递归,我就没了,难受)
2021年11月16日
【1669】合并两个链表(思路:较为简单,通过遍历时计数,保留第a-1个结点和b+1个结点用于与list2连接,重点就是要考虑到list1的头结点也有可能会被删除掉,所以定义的新结点都得是前置虚拟结点)
【215】数组中的第k个最大的数(思路:使用快排,提示超出时间限制,最后我无赖的使用了Java的Arrays.sort()方法直接排序,两行搞定。这种做法不太推荐,看题解是使用什么大顶堆,小顶堆,快速选择排序,没看懂,弃了)
2021年11月17日
【94】二叉树的中序遍历(思路:不能再基础的东西,一年以后如果你还是跟反转链表一样忘记了,你就是废物石锤)
【144】二叉树的前序遍历(思路:不能再基础的东西,一年以后如果你还是跟反转链表一样忘记了,你就是废物石锤)
【145】二叉树的后序遍历(思路:不能再基础的东西,一年以后如果你还是跟反转链表一样忘记了,你就是废物石锤)
【100】相同的树(思路:废了废了,大概是刚刚做了前、中、后序遍历,做熟了,脑子里就光想着先遍历存值,再比较的方法,还做错了,看题解好简便啊,连树的简单题都没做出来,太废了)
【101】对称二叉树(思路:我看题目的第一眼,就是感觉跟【100】相同的树一样但是我错了,大错特错,大佬思路非同凡响,我的思路不堪入目。通过同时一个从左边遍历,一个从右边遍历,只要两边遍历的结点的值一直系统,就是对称镜像的)
【104】二叉树的最大深度(思路:做这几题树相关的算法题下来,只有一个感想,我好菜,题解好强,思路就是使用深度优先算法,递归的退出条件是结点为空时,返回0, 否则左右分别递归,取左右递归返回的两个值中的最大值+1,然后返回)
2021年11月18日
【108】将有序数组转换为二叉搜索树(思路:迄今为止,除了前中后序遍历,没有一题树相关的算法题做出来,都得看题解,我太难了。思路就是不断找数组中间值为root,递归的退出条件是left < right,好烦,做不出来)
2021年11月19日
【110】平衡二叉树(思路:心态崩了啊,好不容易感觉这次可以实现树相关算法的大突破,实现不看题解做出一题树相关算法,超级自信地提交,没想到提交一直失败,唉。)
【111】二叉树的最小深度(思路:我直接按照求最大深度的算法来求,不过把Math.max变成了Math.mn,果然不行,所以,,,还是得看题解。啊啊啊二叉树,我我跟你不共戴天)
【112】路径总和(思路:又没做出来,是我想多了,唉,一步之遥,但是没做出来就是没做出来,迄今为止树算法尚未做对一题,呵,愚蠢的地球人)
【226】翻转二叉树(思路:呵,不是我吹,没人比我愚蠢,又没做出来,递归为什么这么反人类啊,不,不是反人类,是反我。现在我已经无法想象我未来熟练使用递归的场景了,感觉那是梦,那是遥不可及的梦)
【235】二叉搜索树的最近公共祖先(思路:继续期待树的大突破,结果如何,你懂的。重点就是二叉搜索树的性质,左子树都比父节点的值小,右子树都比父节点的值大。所以只要p、q两个结点不是同时大于父节点或同时小于父节点,那这个结点就是最近公共祖先)
2021年11月20日
周末,休息
2021年11月21日
周末,休息
2021年11月22日
【257】二叉树的所有路径(思路:新的一周,开局雷击。我现在非常怀疑自己跟递归的思维相克,我完全无法利用递归写新的算法题,只有看过题解的题目,我才能看懂递归,但是完全无法自己写递归,好迷茫啊,一个礼拜了,还在被递归折磨,我的身体和脑子都在逼我放弃了,好累)
【404】左叶子之和(思路:继续不会做,废物一条,太烦了,看哪一题都感觉没有突破点,递归对我来说太反直觉了)
2021年11月23日
【501】二叉搜索树中的众数(思路:这题勉强能通过部分测试用例,但是部分用例超时了,所以总体来说,还是没做出来啊。放平心态,慢慢来,慢慢来。逐渐忙起来了呀)。
2021年11月24日
【530】二叉搜索树的最小绝对差(思路:突破了,这题没看题解做出来了,非常nice,这是树相关算法的大突破,虽然这题非常简单,虽然这题的解题思路没有那么反直觉,,虽然非常容易想到我这种暴力破解的方法,但是毕竟突破了,嘿嘿,大突破啊)。
2021年11月25日
忙,没做
2021年11月26日
【543】二叉树的直径(思路:我脑子里的思路是正确的,奈何无法用代码表达出来,递归还是太反直觉了。只需要做过【104】二叉树的最大深度,脑子里应该都可以有正确的思路,就是通过获取每个结点的左右子树的最大深度相加,然后与当前最大直径比较,更大就替换。但是代码功底太差了,无法用递归表现出来)。
2021年11月27日
周末,休息
2021年11月28日
周末,休息
2021年11月29日
【563】二叉树的坡度(思路:通过计算每个结点的子树的总值,然后返回左子树与右子树相减的绝对值,重点就是要在获取左右子树的总值的同时,记录坡度相加的值。代码很简单,呵,可是我没做出来)。
【572】另一棵树的子树(思路:与前面的题挺相似的,都是找相同的树,通过找相同的树的方法,可以非常快完成)。
https://blog.51cto.com/u_14486541/5371122
本文来自博客园,作者:易先讯,转载请注明原文链接:https://www.cnblogs.com/gongxianjin/p/17869324.html