leetcode【dynamic】【1】
338. Counting Bits
当前数二进制末位如果是1,加上一次,整体向右移动一位后,新的值是当前数的1/2,它已经被求过了,直接加上去就好了。
343. Integer Break
常规操作存在一种欠考虑的地方,下次自己要先跑两测试再run。
On的方法是:n>4的情况下,3^n是最大的,所以每次抽离3出来乘。
96. Unique Binary Search Trees
还好自己肉眼跑了,比较成功
322. Coin Change
得到的经验就是能用自底向上就用自底向上,同样的逻辑自底向上可以快出两倍。。
221. Maximal Square
我的想法是先计算出长度由最小到最大的正方形的面积,3*3的可以由4个2*2的决定,所以遍历全部,每计算一个n*n的正方体可由4个(n-1)*(n-1)来决定,值得一提的是这四个取值是一个角的四个坐标就够覆盖一整个要求的正方形。时间复杂度m*m*n。
最优解是时间复杂度是m*n,其实特点有上述的一部分。它取的四个值是一个正方形的右下角,具体看这里。
121. Best Time to Buy and Sell Stock
晚上了,看题目以为和mim一样的要求,结果不是。。思路和以为一样有些记录可以转变为记录最终想利用记录的东西的计算的结果。
368. Largest Divisible Subset
这道题不会,要求的是集合内相互之间存在着可以取余为0,那么先进行排序,一个数的约数集合并不一定是答案,但是通过递归,遍历它约数的答案+1取最大就是该数的答案。
416. Partition Equal Subset Sum
这道题比我想象难了点,首先简单拆分成两部分。得到目标的值。一开始想过全组合,利用了位图的思想但是int类型明显字节个数不够,采取递归方式也不行。想到01背包问题,明显知识储备不够,的确是01背包问题。多训练,01表格--》优化成一列足够,注意遍历顺序,从左到右还是从右到左。
474. Ones and Zeroes
比较典型01背包问题,从低向上,优化空间,那么每一次的for循环注意是从大到小,这样才能保证取的是”前一个递归“。
53. Maximum Subarray
动态规划,正常思路是每后面增加一位的影响,但是有一点值得注意是记录以最后一位为结尾的值,实际上取得结果看似在整个数组中的“中间”,实际是某一个数组的最末位那一段,所以递归所有数组的最后一段就是。
72. Edit Distance
动态递归的初始化考虑欠妥。