一个算法笨蛋的1月leetCode刷题日记

类似文章

一个算法笨蛋的2021年11月leetCode刷题日记

一个算法笨蛋的2021年12月leetCode刷题日记

一个算法笨蛋的2022年1月leetCode刷题日记

一个算法笨蛋的2022年2月leetCode刷题日记

一个算法笨蛋的2022年3月leetCode刷题日记

时间情况
2022年1月1日元旦,继续补牙
2022年1月2日元旦,带绝育后的猫去拆线
2022年1月3日元旦,沉迷《金铲铲之战》
2022年1月4日
2022年1月5日
2022年1月6日

【59】螺旋矩阵 II(思路:做出来了,不错不错,嘿嘿,心情贼好,这种题我都写出来了,虽然代码行数比较多,用了30多行,写法也不高明。但是耗时击败100%,内存击败20%也不错了,而且这个思路也非常容易表达出来。由于是顺时针,且初始点为左上角,那么第一步一定时向右找,第二步一定是向下找,第三步一定是向左找,第四步一定是向上找,如果遇到下一个位置的值是初始值0的,就转向)
2022年1月7日

【283】移动零(思路:不看题解做出来了,这题还是挺简单的,使用双指针,一个负责记录连续非零数组的最大索引+1,记为left,一个负责寻找后续数组中的最近非零数right,找到后,两数交换,left++。否则只需要right++。效率不高,耗时击败60%,内存击败40%)
2022年1月8日沉迷《金铲铲之战》
2022年1月9日沉迷《王者荣耀》,新英雄暃真好玩
2022年1月10日

【167】两数之和 II - 输入有序数组(思路:不看题解做出来了,这题很简单,题目提示了是升序数组,那么只需要使用双指针,数组首尾分别为两个初始指针left,right,相加大于target则right–,相加小于target则left++,否则输出两个索引的值,循环条件是left < right)

【169】多数元素(思路:不看题解做出来了,也是非常简单的,用一个map搞定。对我来说这题的考点有两个:其一,让我明白了map虽然不能以基本数据类型为key,但是可以在创建map时,类型定义为基本数据类型的封装类,如Map<Integer,Integer>,这样我们可以直接做map.put(1,10)这种操作,会自动装箱。其二是要在遍历过程中找出最大的数,不能先放到map再遍历map找最大的,效率会低(我一开始有过这种想法,很快舍弃)。耗时击败15%,内存击败95%。看题解还有一种方法,特别简单,因为一定存在这个数,那么数组排序后的中间值必定是该数,效率一般,但是简单好理解)

【240】搜索二维矩阵 II(思路:不看题解做出来了,我最后只想到了对每一个子数组用二分查找,效率也还行,耗时击败97%,内存击败16%。除了这种方法,还有暴力直接双重for循环,以及以右上角为起始点,进行比较的方法,效率一般)

【905】按奇偶排序数组(思路:不看题解做出来了,这题还是非常简单的,之前是做过类似题目的,都是使用双指针,一个找奇数,一个找偶数,然后交换,都是头指针。效率非常nice,时间击败100%,内存击败94%)(数组已23题)

【1010】总持续时间可被60整除的歌曲(思路:看了题解以后做出来了,代码的简洁程度上,比题解强。最后做出来是耗时击败100%,内存击败92%。不得不感叹一声,思路突破天际。一开始我是直接用双重for循环试了一下,不出意外,超时了。然后就想不出来了。最后看了题解,发现思路巧妙,通过定义一个长度为60的新数组统计每个余数的个数保存起来,然后两个余数相加为60的个数相乘,然后对0和30这两个特殊的余数做一下处理就好。理解了。然后就自己琢磨着不看题解写出来。写出来后比题解的代码简洁易懂多了,舒服)
2022年1月11日

【15】三数之和(思路:没做出来,实在是太可惜了。断断续续花了一天的摸鱼时间,版本改了又改,从来就没尝试过使用三重for循环,我知道必定超时,于是使用双指针,但是使用双指针写出来的方法,一开始是部分特殊测试用例不通过,删删改改到最后,所有特殊测试用例都能通过了,但是在面对最长那个测试用例超时了,唉,改不动了,就直接看题解了。题解也是用双指针,但是他的比我的巧妙一点,尤其在最后去重的步骤)
2022年1月12日

【189】轮转数组(思路:没看题解做出来了,想了两个方法,第一种是新建个list,第一个for循环获取数组后k%nums.length(取余,防止k大于数组长度)个存入list,第二个for循环将数组中的前(nums.length - k)个后移k个位置,第三个for循环将list中的k个元素一次放入数组中的前k个。时间击败13%,内存击败8%。第二个方法是新建个双倍长度的数组,第一个for循环将新数组依次填上两次原数组的元素,如原数组为【1,2,3】,新数组则为【1,2,3,1,2,3】,第二个for循环将新数组中的第i + (nums.length - k)个开始依次填充到原数组。时间击败66%,内存击败42%。暂未想到题目中,空间复杂度为O(1)的算法)
2022年1月13日

【164】最大间距(思路:没看题解做出来了,耗时和内存击败都是30%,这题应该是要考察排序算法的吧,但是Java对数组有相应的排序API,我用什么算法都比不上Java的API,之前研究过,Java的排序api会根据不同的数组长度,自动挑选合适的排序算法,我就不献丑了,而且基数排序和桶排序我现在也忘得差不多了,手搓不出来)

【75】颜色分类(思路:没做出来,本来想要直接用Arrays.sort()解决,但是题目要求不许用代码库中的排序函数,并且要求使用一趟扫码算法,有点想法,发现双指针实现不了,就不太敢想了,因为没接触过过三指针,最后遗憾退场)

【88】合并两个有序数组(思路:没看题解做出来了,用的方法比较简单,把nums2中的数据放入nums1中,再对nums1排序即可,我又偷懒,用Arrays.sort()代替了,然后又去看了下快排的代码,快排又有点忘了,这脑子,陆陆续续写了整整18遍快排了,还能忘一些,吓得我赶紧又写了一遍快排)

【977】有序数组的平方(思路:没看题解做出来了,但是用的是暴力解法,约等于没做出来,我想半天,也觉得不可能用双指针,时间复杂度为O(n)做出来,最后看题解,恍然大悟。由于平方最大值只可能产生于数组的最左边或者最右边,所以定义一个等长的新数组,再定义首尾指针,找出两个指针中的平方最大值,填入新数组的最后即可。下一个就是插入到倒数第二个位置,循环如此。退出条件是首指针索引大于尾指针索引)
2022年1月14日

【225】用队列实现栈(思路:没看题解做出来了,这题让我学习到的地方就是让我更加了解了队列,LinkedList是实现了Deque,Deque中有各种对peekLast(),removeLast(),addLast()等api,非常适合用来构建栈。而Deque实现了Queue,所以使用LinkedList完全符合题意。时间耗时击败100%,内存击败25%)

【232】用栈实现队列(思路:看了题解的文字思路做出来了,一开始没啥思路,知道一个栈肯定实现不了,应该要用两个栈,而我想的是两个栈都有完整的数据,然后一个正序,一个逆序,然后细想后发现实现不了,就没办法了。看题解的思路解析,然后自己把代码写出来了,效率也还行,耗时击败100%,内存击败75%。思路就是将两个栈分为输入栈和输出栈,输入时,遍历输出栈,将输出栈中的数据依次pop,push进输入栈,完毕后,再push原本要加的元素。pop则相反,一样的逻辑)
2022年1月15日周末,休息,历时5周,终于补完牙了
2022年1月16日周末,休息
2022年1月17日

【64】设计循环双端队列(思路:没看题解做出来了,效率不太信,时间击败16%,内存击败77%。提交后看题解,发现唯一的Java题解是直接使用LinkedList,然而题目明确表示不允许使用内置的双端队列库,简直离大谱了。我是使用数组,耗费一上午的时间才做出来的,有一些测试用例需要反复调试才能通过。思路是一个数组分为前段数组和后段数组,insertFirst永远只写入arr[0], insertLast永远只插入arr[arr.length - 1]。然后利用两个初始值分别为-1,k的指针记录为前段数组的最后索引,以及后段数组的最前索引,用于插入时后移)

【64】字符串中的第一个唯一字符(思路:没看题解做出来了,简单题,但是做的非常勉强,使用了两个for循环,主要是第二个for循环找第一个不重复的字符时思路卡住了,需要返回索引,而我的map中key为字符,value为次数,唯独不带索引,最后想到了map.get(s.charAt(i)) ==1)的方法,最后返回i即可。唉,我果然还是菜逼,简单题都勉勉强强。时间击败23%,内存击败96%)
2022年1月18日

【933】最近的请求次数(思路:没看题解做出来了,简单题,我知道我在刷的是队列的tag,但是看题目,脑子里就想到了用list来解决,最终解决了,效率低下,耗时击败8%,内存击败70%。看题解利用队列的性质peek和poll几行代码就写出来了,归根到底还是对队列不熟悉,打心底里抗拒陌生的知识,唉)

【950】按递增顺序显示卡牌(思路:看了题解才做出来,这题实在没啥思路,也不知道考察啥,看了题解,了解到方法,代码好写,但是方法真不是正常人能想出来的,无话可说。)

【1352】最后K个数的乘积(思路:看了题解才做出来,最普通的解法我秒解,就是中规中矩的定位倒数第k个数,然后遍历相乘得到结果即可,但是对于超长的测试用例会超时。我当时感觉不可理喻,根本不可能还有其他解决办法啊。但是后来看题解,我学习到了前缀积的概念。list中不实际存添加的值,存的是前缀积,例如依次加入【2,4,3,2】,list中保存的会是【2,8,24,48】,倒数第k个数的乘积就等于最大的乘积除以倒数第k+1个乘积,不需要累乘了,耗时击败44%,内存击败53%)
2022年1月19日

【242】有效的字母异位词(思路:这题比较简单,就是不要去想着题目中的进阶提示,否则容易想多,直接两个字符串分别调用toCharArray()方法获取字符数组,然后对数组排序,再利用Arrays.equal(arr1,arr2)即可)

【409】最长回文串(思路:没看题解做出来了,这题是简单题,我用的方法比较复杂,字符串s获取字符数组,字符数组遍历存map,通过map.values()方法获得所有value存入list中,对list遍历,与2取余,为0则直接加,为1则减一。做出来后还沾沾自喜,但是看了题解,发现我的解法麻烦的要死。同样的思路,题解只需要利用一个128位的数组,代码也比我少一大半,效率还比我高,气死。)

【205】同构字符串(思路:没看题解做出来了,这题是简单题,我用的方法比较复杂(题题都是用复杂的解法,我的思维被局限住了)。效率也比较低,耗时击败49%,内存击败7%。解题方法说起来比较复杂:核心思路就是利用map,list和一个从0开始计数的cur指标,遇见map中没有的字符,就直接加入map,cur加入list,cur++,map中有的字符,就直接取出map中字符对应的数字加入list。两个字符串都如此操作,最后比较两个list,完全一样则为同构字符串)
2022年1月20日
开始做动态规划了,害怕

【300】最长递增子序列(思路:这是我做的第一个正经的动态规划的题目,通过微信公众号labuladong大佬的文章得知这题,做肯定是没做出来的,我看到题目,找半天都发现不可能写出状态转移方程,然后看到大佬的解析,惊为天人,好强,我根本就写不出这种方程,欠练啊。理解后,倒是能够凭借理解默写出代码了,就是换个题目我又会找不到状态转移方程了)

【931】下降路径最小和(思路:这是我做的第二个正经的动态规划的题目,通过微信公众号labuladong大佬的文章得知这题,做肯定是没做出来的,我看到题目,有一丝思路,但是无法转换为代码,还是一团浆糊。每一个题目都有不同的状态转移方程,但是每一个状态转移方程的表现形式都不同。重回刚开始做树算法至暗时刻)
2022年1月21日

【72】编辑距离(思路:这题是困难题,为了理解这题,从上午看到下午,总算是让我理解了一点点,并为此肝了篇博客出来,动态规划也熟悉了一点,再接再厉。精简一点的感悟就是关于“选择”这个概念的,动态规划都是通过“选择”来穷举,并找出最值,如0-1背包问题选择放入和选择不放如;如编辑距离选择增、删、或者替换;如爬楼梯,选择爬一阶楼梯和选择一次爬两个楼梯;如最长子序列,选择加和选择不加(这个比较牵强)。还有就是“dp table”的推导,也有了一丝丝感悟)
2022年1月22日周末,沉迷看小说、沉迷撸猫
2022年1月23日周末,沉迷看小说、沉迷撸猫
2022年1月24日

【354】俄罗斯套娃信封问题(思路:这题也是困难题,不过基本就是【300】最长递增子序列 的拓展题,区别不大,我们只需要进行一定的排序,后面再使用子序列的套路解答就行,不过这里有个细节必须注意,排序时是数组第一个数按升序排序,如果第一个数相等,第二个数要按倒序排序。重点“第二个数要倒序排序”,否则会导致某些情况下出现多一个的错误 )

【354】最大子数组和(思路:这题简单,不过状态转移方程也是要点思考的,我一开始的状态转移方程写着写着就变成了求数组最大和,不过稍微变一下就行,要么加上当前值,要么不加,又是一个选择,用代码标识出来就行,dp数组也是用一维就行 )

【1143】最长公共子序列(思路:这题居然是medium题,是看代码量来判断难易程度吗?对我来说,如果不给我思路,我想一辈子都想不到的。我初看这题,把题目中的例子头脑风暴了半个小时,脑细胞死了几亿个,一点点思路都没有,完全无法与动态规划结合起来,我甚至觉得这题除了暴力解法,无解。然而看了题解,发现还是自己太菜了,代码不多,和其他动态规划的方法是一样一样的,累了,毁灭吧)
2022年1月25日

【5】最长回文子串(思路:这题用迭代会比用动态规划好一点,思路也好理解,我们只需要从头到尾,以每一个字符作为回文串的中心进行左右遍历找回文串就行,然后把所有字符中最大的那个回文串保存起来就行。需要注意的是,回文串有可能有两个字符作为中心的可能性,所以需要适配这种情况。需要定义一个适配两种情况的求最大回文串的方法,传参为字符串,字符索引,字符右索引。如果是一个字符为中心的情况,两个索引相同,否则就是i,和i+1;写起来还是不难的)
2022年1月26日

【516】最长回文子序列(思路:动态规划的题都好变态啊,这题相比较于【5】最长回文字符串,难度又有提高,思路需要非常非常清晰才行,想出来难,但是理解起来还好:假设dp[i][j]代表s.substring(i,j)字符串中的最长子序列,那么i == j时,dp[i][j] 必然等于 1,并且如果i > j,必然为0,这就是base case了(好好想想,能想通的);如果两个字符相等,那么就有dp[i][j] = dp[i+1][j-1] + 2(好好想想,能想通的);如果两个字符不相等,那么就有dp[i][j] =Math.max(dp[i+1][j],dp[i][j-1]);所以最大值会在dp[0][s.length() - 1]中产生)

【416】分割等和子集(思路:动态规划的题太难了,烦。转化为0-1背包问题,背包容量为nums/2,nums中的数字为物品的重量,问是否能够使背包刚好装满;dp[i] = true代表前i个物品能够刚好装满。状态转移方程是:dp[j] = dp[j]
2022年1月27日
2022年1月28日
2022年1月29日
2022年1月30日
2022年1月31日
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

三七有脾气

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值