动态规划
良良2号
小时候真傻,居然盼着长大。
展开
-
最大/最小连续序列和问题
思路f(i):返回以i为结尾的序列的最大和,以什么为开头不重要。子数组的最大累加和f(i) = f(i-1) > 0 ? f(i-1)+arr[i] : arr[i]代码/** * @param {number[]} nums * @return {number} */var maxSubArray = function(nums) { // pre: 以i-1为结尾的最大和 let max = nums[0]; let pre = 0; nu原创 2021-08-18 22:28:10 · 171 阅读 · 0 评论 -
贪心算法之跳跃游戏
跳跃游戏思路思路转换: 通过题目中的跳跃规则,最多能跳多远?如果能够越过最后一格,返回 true,否则返回 false贪心:每一步都跳到最远处,来与全局最优解farest比较,通过每一步的最优解,更新全局最优解。代码/** * @param {number[]} nums * @return {boolean} */var canJump = function(nums) { let n = nums.length; if(n==1) return true;原创 2021-05-01 01:29:28 · 217 阅读 · 0 评论 -
动态规划之分割等和子集
分割等和子集思路dp[i][j]: 只用前i个数字,恰好可以把容量j的背包装满。求解dp[nums.length][sum/2], i!=0若是要装入第i个物品, 则正好装满的情况为: dp[i][j] = dp[i-1][j-nums[i-1]]若是不装第i个物品, 可能是装不下(j-nums[i-1]<0), 或者压根不想装: dp[i][j] = dp[i-1][j]代码/** * @param {number[]} nums * @return {boolean} */原创 2021-03-17 19:07:11 · 74 阅读 · 0 评论 -
动态规划之套娃(最长递增子序列升级版)
套娃思路先排序,然后求最长递增子序列。按 w 升序排序, 对于宽度 w 相同的数对,要对其高度 h 进行降序排序。代码/** * @param {number[][]} envelopes * @return {number} */var maxEnvelopes = function(envelopes) { envelopes.sort(function(x, y){ if(x[0]<y[0]){ return -1;原创 2021-03-16 11:43:16 · 83 阅读 · 0 评论 -
动态规划之编辑距离
编辑距离思路两个字符串问题: 两个指针分别指向两个字符串的 结尾,从后往前扫描。dp(i, j): word1[0...i] 转换为 word2[0...j] 所使用的最少操作数。if w1[i]!=w2[j], 插入一个字符dp(i, j)=dp(i, j-1)+1。..............., 删除一个字符dp(i, j)=dp(i-1, j)+1。..............., 替换一个字符dp(i, j)=dp(i-1, j-1)+1。if w1[i]==w2[j], dp(i原创 2021-03-16 10:53:08 · 53 阅读 · 0 评论 -
动态规划之最大子序和
最大子序和思路dp(i): 以i结尾的连续数组最大和dp(i) = dp(i-1) + nums[i], if dp(i-1)>=0dp(i) = nums[i], if dp(i-1)<0代码/** * @param {number[]} nums * @return {number} */var maxSubArray = function(nums) { let n = nums.length; let dp = new Array(n).fill(原创 2021-03-10 13:43:12 · 57 阅读 · 0 评论 -
动态规划之最长递增子序列
最长递增子序列思路dp(s, i): 下标从0~i-1的严格递增子序列长度dp(s, i) = max(dp(s, j))+1,前提是j<i,且nums[j]<nums[i]代码/** * @param {number[]} nums * @return {number} */var lengthOfLIS = function(nums) { // dp(s, i): 下标从0~i-1的严格递增子序列长度 let n = nums.length;原创 2021-03-09 14:57:33 · 39 阅读 · 0 评论 -
最长公共子序列/子串
最长公共子序列思路思路一dp(s1, i, s2, j) 表示s1从i位置开始, s2从j位置开始 的最长公共子序列长度如果s1[i]==s2[j],则s1[i]和s2[j]都在最长子序列中,dp(s1, i, s2, j) = dp(s1, i+1, s2, j+1)+1如果s1[i]!=s2[j],则s1[i]或者s2[j]至少有一个不在最长子序列中,dp(s1, i, s2, j) = 以下三种情况的最大值若s1[i]不在最长子序列中:dp(s1, i+1, s2, j)若原创 2021-03-01 13:08:26 · 63 阅读 · 0 评论 -
动态规划之凑零钱
凑零钱思路dp(n): 凑出n元至少需要dp(n)枚硬币状态转移方程:dp(n) = min(dp(n-1)+1, dp(n-2)+1, dp(n-5)+1) (假如零钱面额为1、2、5)dp(0) = 0代码/** * @param {number[]} coins * @param {number} amount * @return {number} */var coinChange = function(coins, amount) { let dp = n原创 2021-02-26 19:07:13 · 287 阅读 · 0 评论 -
动态规划之爬楼梯
爬楼梯思路共有f(n)种方式爬n阶楼梯状态转移方程:f(n) = f(n-1) + f(n-2)边界1: f(1) = 1边界2: f(2) = 2代码/** * @param {number} n * @return {number} */var climbStairs = function(n) { // 动态规划 // 时间----O(n) 84ms // 空间----O(n) 37.8MB // let dp = new Array(n原创 2021-02-21 12:12:16 · 83 阅读 · 0 评论 -
动态规划之最长回文子串
最长回文子串思路dp[i][j]: 以下标i开头, 下标y结尾的字符串是否为回文串状态转移方程:dp[i][j] = (dp[i+1][j-1]) && (s[i]==s[j])循环i递减, j递增边界1: i==j, dp[i][j]=1边界2: j=i+1, dp[i][j]=(s[i]==s[j])代码/** * @param {string} s * @return {string} */var longestPalindrome = function(s原创 2021-02-21 11:47:53 · 137 阅读 · 0 评论