编程语言
首页 > 编程语言> > ⑬ 算法设计思想之“动态规划”

⑬ 算法设计思想之“动态规划”

作者:互联网

一、理论

1. 简介

2. 斐波那契数列

3. 动态规划 VS 分而治之

关键区别 典例代表
动态规划 子问题相互重叠 斐波那契数列
分而治之 子问题独立 翻转二叉树

二、刷题

1. 爬楼梯(70)

1.1 题目描述

1.2 解题思路

输入:n = 3
输出:3
解释:有3种方法可以爬到楼顶

  1. 1 阶 + 1 阶 + 1阶
  2. 2 阶 + 1 阶
  3. 1 阶 + 2 阶

1.3 解题步骤

// 空间复杂度:O(n)
function climbStairs(n) {
  if(n < 2) { return 1; }
  let dp = [1, 1];
  for(let i = 2; i <= n; i++) {
    dp[i] = dp[i-1] + dp[i-2];
  }
  return dp[n]
}
// 空间复杂度:O(1)
function climbStairs(n) {
  if(n < 2) { return 1; }
  let dp0 = 1, dp1 = 1;
  for(let i = 2; i <= n; i++) {
    const temp = dp0;
    dp0 = dp1;
    dp1 = dp1 + temp;
  }
  return dp1
}

1.4 时间复杂度&空间复杂度

2. 打家劫舍(198)

2.1 题目描述

2.2 解题思路

输入:[1,2,3,1]
输出:4
解释:偷窃 1 号房屋 (金额 = 1) ,然后偷窃 3 号房屋 (金额 = 3)
偷窃到的最高金额 = 1 + 3 = 4

2.3 解题步骤

// 空间复杂度:O(n)
function rob(nums) {
  if(nums.length === 0) { return 0; }
  const dp = [0, nums[0]];
  for(let i = 2; i <= nums.length; i++) {
    dp[i] = Math.max(dp[i-2] + nums[i-1], dp[i-1]);
  }
  return dp[dp.length - 1]
}
// 空间复杂度:O(1)
function rob(nums) {
  if(nums.length === 0) { return 0; }
  let dp0 = 0, dp1 = nums[0];
  for(let i = 2; i <= nums.length; i++) {
    const dp2 =  Math.max(dp0 + nums[i-1], dp1);
    dp0 = dp1;
    dp1 = dp2;
  }
  return dp1
}

2.4 时间复杂度&空间复杂度

三、总计 -- 技术要点

动态规划的步骤

  1. 定义子问题
  2. 反复执行

标签:偷窃,复杂度,问题,算法,解题,房屋,动态,规划
来源: https://www.cnblogs.com/pleaseAnswer/p/15879699.html