本文是对leetcode中dynamic programing标签下的top interview question进行总结
leetcode 62. Unique Paths
dp[i][j] = dp[i-1][j] + dp[i][j-1]
dp[i][j]代表走到(i,j)坐标的所有路径数
Leetcode 121. Best Time to Buy and Sell Stock
dp[i] = min(dp[i-1], nums[i])
dp[i]代表i之前的最小价格数,记录的并不是直接结果,而是序列中的某个属性,比如最小值。
Leetcode 70. Climbing Stairs
dp[i] = dp[i-1] + dp[i-2]
dp[i]表示爬到第i步台阶的方法数
Leetcode 279. Perfect Squares
dp[i] = min(dp[i], dp[i - squares[j]] + 1)
dp[i]代表构成数i的平方数的最小数量
leetcode 53. Maximum Subarray
dp[i] = (dp[i-1] + nums[i],nums[i])
dp[i]表示以nums[i]结尾的最大子数组和
有的dp[i]是表示i及i之前的满足条件的数,有的dp[i]是限制以i结尾的满足条件的数
Leetcode 300.longest-increasing-subsequence
dp[i] = max(dp[j] + 1, dp[i]);
dp[i]表示以i结尾时的最大长度
Leetcode 198. House Robber
dp[i] = max(dp[i-1], dp[i-2] + nums[i])
dp[i]表示抢劫第i家时的收益
Leetcode 139. Word Break
dp[i]表示以第i个位置结尾的字符串是有效的,那么只需要考虑i-j之间的字符串是否有效。
本题并无具体的动态转移方程,dp[i]只是代表属性的成立以否,在分支判断中使用,从而减少复杂的重复判断。
Leetcode 322. Coin Change
与Leetcode 279. Perfect Squares类似
dp[i] = min(dp[i], 1 + dp[i - coins[k]]);
dp[i]表示兑换i元所需的最小硬币数
leetcode 152. Maximum Product Subarray
dpMax[i] = Math.max(Math.max(dpMax[i-1]*nums[i],dpMin[i-1]*nums[i]),nums[i]);
dpMin[i] = Math.min(Math.min(dpMax[i-1]*nums[i],dpMin[i-1]*nums[i]),nums[i]);
dpMax[i]表示以i结尾的最大乘积
dpMin[i]表示以i结尾的最小乘积
Leetcode 140. Word Break II
dp[string]表示字符串string的拆分结果,如果再次碰到string,那么可以直接取用,不需要重复拆分
也是没有具体的状态转移方程。
Leetcode 5. Longest Palindromic Substring
字符串回文dp,思维方式在Leetcode 131. Palindrome Partitioning已经讨论过,如果想让第i-j之间的字符串为回文的话,那么要求i+1-j-1之间的字符串也为回文。
dp[i][j] = dp[i+1][j-1] && s[i] == s[j]
dp[i][j]表示从第i-j个字符之间的字符串是否为回文
Leectode 91. Decode Ways
dp[i] = dp[i-1] + dp[i-2] (带有约束的,实际程序编写并非这么直接)
dp[i]表示以第i个字符结尾的字符串的decode数。
summary
- 使用dp时要确定:1、当前状态与之前哪些状态相关,在什么条件下,与什么状态相关;2、动态转移方程
- 常见的状态形式有:1、dp[i]表示i及i之前所有数中满足条件属性的值,记录的并不是直接结果,而是序列中的某个属性,也有可能是true/false;2、dp[i]表示以i结尾的序列满足条件的值,往往直接对应答案;
- 主要有dp[i]和dp[i][j]两种形式。后者经常用在字符串或者二维中的坐标。