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

类似文章

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

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

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

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

时间 情况
2022年2月7日
【474】一和零(思路:同样是动态规划中的0-1背包问题,我想到要用三维数组,但是想不到状态转移方程,脑子里还想着要给这个三维数组进行初始化,发现不现实,然后就gg了。看题解确实是用三维dp数组,方法同样巧妙,dp[i][j][k]代表的是前面k个字符串,有j个0,k个1,值为子集的长度。在一重循环中获取当前字符串的0的个数zeros和1的个数ones,在三重循环中进行判断选择放入背包或者不放入,不放入就是dp[i][j][k] = dp[i-1][j][k];放入(判断能否放入,即j >= zeros,k >= ones)就是dp[i][j][k] = Math.max(dp[j][k],dp[j-zeros][k-ones] + 1) )
2022年2月8日
【494】目标和(思路:回溯方法好理解,也好些,动态规划方法无法理解,看题解看不明白,不看了,以后再看)

【518】零钱兑换 ll(思路:这题就好理解多了,不过还是不能都独自做出来,动态规划的题目太难了,太多细节了,思路太清奇了,不过也有我脑子不够的原因,我看其他人做十几题动态规划的题都开始明悟了,而我还是局限在写不出状态转移方程的这一步,看了题意恍然大悟,不看题意难若登天,悲哉。每一题都要按小时来计算时间,太难了)

【70】爬楼梯(思路:好吧,这题太经典,太简单了,轻易做出来了,但是这题不算不算,我还是菜鸡,我还是做不出动态规划)
2022年2月9日
【118】杨辉三角(思路:嘿嘿,这题我做出来了,虽然这是动态规划里极少数的简单题,基本就是总结规律的题目dp[i][j] = dp[i-1][j-1] + dp[i-1][j]。但是毕竟做出来了,花费的时间也比较短,哈哈哈哈哈,舒服,耶斯莫拉)在这里插入图片描述

【119】杨辉三角II(思路:这题也做出来了,由于题目的进阶要求是空间复杂度为O(n),所以必须进行压缩,将二维数组压缩为一维数组,为此我花费了接近一个小时才做出来,使用一个额外变量temp保存当前即将被改变的旧值,用于下一个计算使用,也是使用了双重for循环,在第一层循环初始化temp=1,后续在第二个循环只有如下两行代码:dp[j] = temp + dp[j]; temp = dp[j] - temp; 我感觉直接设计 的非常巧妙,一般人未必能跟上这思维,哈哈,好嗨哟)

【121】买卖股票的最佳时机(思路:这题也做出来了,连续四题简单动态规划题做下来,信心大增啊,虽然感觉这些题感觉都不算严格的动态规划题(这题我就没用动态规划的方法)。我这波就是利用三个额外变量,进行一次遍历,计算得出。三个额外变量分别是前i个价格中的最小值min,前i个价格中的最大差值max,第i个价格与min的差值temp,在遍历过程中实时更新min,max,最后返回max即可)

【22】括号生成(思路:果然一做medium题就原形毕露了,根本遭不住呀,看着这题一点点思路都没有。百度后得知的思路:当i = n时,组合一定以“(”开头,只需要确定“)”结束的位置,并且"("、")"之间的括号组合必须为合法的(dp[a]),然后只需要将剩下的n - 1 - j个括号组合放在右侧即可(dp[b]),所以可以推导出dp[n] = “(” + dp[a] + “)” + dp[b];(a = 0 ~ i-1,a + b = n - 1)抱歉,这种思路我完全想不到,脑子只有一片空白,毁灭吧。)在这里插入图片描述

【55】跳跃游戏(思路:这次的medium的我做出来了,嘿嘿,第一个自己做出来的medium动态规划题,舒服。但是我的效率比较差,时间空间都低于10%,后来自己琢磨了一下,第二层遍历使用倒序遍历应该可以优化一些。结果证明我琢磨对了,从700ms左右优化到了50ms左右,但是耗时击败也只是从低于10%变成了15%。我看题解,用贪心算法是最快的,只需要2ms左右,只用了一层循环。不过我看其他人的动态规划解法,貌似还没我优化后的解法好,无论是代码量还是耗时,我都远远超过,嘿嘿)
2022年2月10日
【63】不同路径II(思路:这次的medium级别的题我也做出来了,不过有一个重要因素,因为这题是【62】不同路径的进阶题,所以理论上的状态转移方程都一样,所以这题的难度就大大降低了,我的解法还是利用了二维数组,但是我看题解进行了状态压缩,利用滚动数组的思想,将状态压缩成了一维,我还有点看不懂这解法,有点菜了)

【64】最小路径和(思路:这大概是我做过最简单的medium级别的动态规划题了,轻轻松松10分钟不到一次运行成功,简直不要太简单,比easy级别的杨辉三角还简单的多,也许是我变强了?!不过吸取上次我做【63】不同路径II的教训,感觉应该还可以进行状态压缩,我还是用的二维dp数组,不过看了所有的Java题解,都是用的二维数组,官方题解倒是提了一句可以优化为一维,不过没写出题解,遂不了了之)

【91】解码方法(思路:这题我通过了90%的用例,只有在一种情况下无法通过,没法子,感觉要概括这种情况有点复杂,算法不可能如此不优美,肯定是思路错了,所以就把代码全删了,看了题解,果然我的思路有问题,根本不需要那么多if的例外情况,但是大体思路上还是一样的,就是表达方式上天差地别,没做出来)
2022年2月11日
【91】交错字符串(思路:这题研究了一上午,代码改了又改,还是无法通过部分测试用例,跟上一题一样。我发现我是直接妄图使用一维来解决,所以状态定义的也不太好,主要是前面一直没有考虑到两个字符串长度不同的情况,改来改去,通过的测试用例越来越多,但是当我发现无法解决长度不同的问题的时候,我就知道我失败了。正确的状态定义应该是dp[i][j]代表s1的前i个字符,与s2的前j个字符,是否符合s3中的前i+j-1个字符为交错字符串。)
2022年2月12日 周末,沉迷王者
2022年2月13日 周末,沉迷王者
2022年2月14日 busy with work
2022年2月15日 busy with work
2022年2月16日
【120】三角形最小路径和(思路:nice,这题花费些时间,完美写出来了,这是medium题,也是正规的动态规划题,哈哈,真真切切的做出来了。说一下我的思考历程,首先肯定是要定义状态,也就是先假设是二维dp[i][j],(我无论啥题,都是先假设二维dp,定义不出来就再尝试一维,三维来定义),然后尝试用一句话表达出来,例如:dp[i][j]代表的是在第i行,第j列时,最小的路径和。读下来发现,非常通顺且合理,那就是这样定义了。ps(我一开始的解读是前i行的第j列的路径和为dp[i][j],然后就发现j表达不出含义,于是又尝试去使用一维dp去了,然后再做的过程中,发现一维不行,就又重新从二维出发,最终才确定了状态)。状态确定后,就画个dp表推导下,于是我发现了猫腻,dp[i][j]有可能是dp[i-1][j]或者dp[i-1][j-1]推导过来的(用dp表推导下,就能够发现),所以自然而然的,就推导出了状态转移方程,篇幅有限,还有非常多边界条件和初始化,就不表述了,用一句话概括就是,看着推导出来的dp表来写。)
2022年2月17日
【122】买卖股票的最佳时机 II(思路:就这?可不要太简单,还是medium题呢,相对于【121】买卖股票的最佳时机,区别就是这题可以多次买入卖出,【121】只能买卖一次,但是完完全全没对我造成干扰,这就是简单的数学归纳,我依照着自己总结的动态规划题目的规律,先找状态,再确认dp数组的含义,然后总结状态转移方程,然后就完成了。这题的dp数组可以表示为:dp[i]表示在前i天,能够获取到的最大利润。状态转移方程我一下子就找到了dp[i] = prices[i] - prices[i-1] + dp[i-1],简单,写完一个字符都没改,直接提交通过)
2022年2月18日
2022年2月19日
2022年2月20日
2022年2月21日
2022年2月22日
2022年2月23日
2022年2月24日
2022年2月25日
2022年2月26日
2022年2月27日
2022年2月28日
2022年2月29日
2022年2月30日

你可能感兴趣的:(leetCode,数据结构与算法,算法,leetcode,动态规划)