087:打家劫舍
LeetCode 198 https://leetcode.cn/problems/house-robber/description/ 难度:中等 状态转移: f[i + 2] = max(f[i + 1], f[i] + nums[i]); 时间复杂度:O(n)。其中 n 为 nums 的长度。 空间复杂度:O(n)。 ...
LeetCode 198 https://leetcode.cn/problems/house-robber/description/ 难度:中等 状态转移: f[i + 2] = max(f[i + 1], f[i] + nums[i]); 时间复杂度:O(n)。其中 n 为 nums 的长度。 空间复杂度:O(n)。 ...
LeetCode 152 https://leetcode.cn/problems/maximum-product-subarray/description/ 难度:中等 动态规划,类似 LeetCode 53 最大子数组和。由于负负得正,需要维护以 i 结尾的连续子数组乘积的最大值和最小值。 f_max[i] = max({f_max[i - 1] * x, f_min[i - 1] * x, x}); f_min[i] = min({f_max[i - 1] * x, f_min[i - 1] * x, x}); 时间复杂度:O(n),其中 n 是 nums 的长度。 空间复杂度:O(n)。 ...
LeetCode 70 https://leetcode.cn/problems/climbing-stairs/description/ 难度:简单 斐波那契数列。f[i] = f[i - 1] + f[i - 2]。 时间复杂度:O(n)。 空间复杂度:O(n)。 ...
LeetCode 32 https://leetcode.cn/problems/longest-valid-parentheses/description/ 难度:困难 本题是一道一维 DP 的题目。f[i] 表示以 i 结尾的最长有效括号的长度。由于有效括号只会以 ‘)’ 结尾,所以只在当前字符为 ‘)’ 时的状态转移。 当前一个字符为 ‘(’ 时,转移到 f[i] = f[i - 2] + 2。 当第 i - f[i - 1] - 1 个字符为 ‘(’ 时,将原本不连续的两段长度合并,即转移到 f[i] = f[i - 1] + f[i - f[i - 1] - 2] + 2。 时间复杂度: O(n),其中 n 为字符串的长度。我们只需遍历整个字符串一次,即可将 dp 数组求出来。 空间复杂度: O(n)。我们需要一个大小为 n 的 dp 数组。 ...
LeetCode 1143 https://leetcode.cn/problems/longest-common-subsequence/description/ 难度:中等 LCS 线性 DP 问题,状态转移方程如下: if (s[i] == t[j]) { f[i + 1][j + 1] = f[i][j] + 1; } else { f[i + 1][j + 1] = max(f[i + 1][j], f[i][j + 1]); } 时间复杂度:O(nm)。 空间复杂度:O(nm)。 ...
LeetCode 72 https://leetcode.cn/problems/edit-distance/description/ 难度:中等 这是线性 DP 的经典题目,类似 LeetCode 1143 最长公共子序列。 状态转移方程为: //word1[i] == word2[j] f[i + 1][j + 1] = f[i][j]; //word1[i] != word2[j] f[i + 1][j + 1] = min({f[i + 1][j], f[i][j + 1], f[i][j]}) + 1; 在不相等时,三种情况分别对应插入,删除,替换的情况。 此外,还要注意数组的初始化操作。 f[i + 1][0] = i + 1; f[0][j + 1] = j + 1; 时间复杂度:O(nm),其中 n 为 word1 的长度,m 为 word2 的长度。 空间复杂度:O(nm)。 ...