知识点
LeetCode算法题
LeetCode算法题
复习
72.【编辑距离】
解题思路:
两个字符串动态规划问题,一般都需要两个指针,分别指向两个字符串的末尾,然后开始解决问题。
学习
64.【最小路径和】
解题思路:
一般矩阵中求最优化问题,都需要使用动态规划技巧。
先利用递归思路,写出递归函数,穷举出结果。然后利用备忘录,处理重叠子问题。这就是标准的自顶向下的动态规划了。
当然,我们也可以利用迭代,写出自底向上的动态规划解法。状态转移方程是不变的,因此比较容易写出。
931.【下降路径最小和】
494.【目标和】(很有意思)
解题思路:
首先,想到可以通过回溯算法解题。回溯算法时间复杂度为O(2^N)。
然后,想到可以通过备忘录消除重叠子问题。相当于回溯算法的剪枝,最坏情况下,时间复杂度仍然为O(2^N)
我们转化一下问题:把 nums 划分成两个子集 A 和 B,分别代表分配 + 的数和分配 - 的数,那么他们和 target 的关系为sum(A) - sum(B) == target。转化一下变为sum(A) == target + sum(B),再转换一下sum(A) + sum(A) = target + sum(nums),最终转化为sum(A) == (target + sum(nums)) / 2。
因此,该问题就变成了,nums中有几个子集A满足sum(A) == (target + sum(nums)) / 2。
子集划分问题是经典的背包问题,因此该题目又变为了:nums中的元素,如果每个只能取一次,装满(target + sum(nums)) / 2有几种装法。