算法打卡第八天 (动态规划)

127 阅读2分钟

问题

  1. 剑指 Offer 10- I. 斐波那契数列
  2. 剑指 Offer 10- II. 青蛙跳台阶问题
  3. 剑指 Offer 63. 股票的最大利润

还需要继续学习,以前的知识点都忘了

剑指 Offer 10- I. 斐波那契数列

写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项(即 F(N))。斐波那契数列的定义如下: F(0) = 0, F(1)= 1 F(N) = F(N - 1) + F(N - 2), 其中 N > 1. 斐波那契数列由 0 和 1 开始,之后的斐波那契数就是由之前的两数相加而得出。

答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。特别要注意的就是此处,每次迭代都需要计算,不能放到最后再计算

题意分析 fn(0) = 0 fn(1) = 1 fn(n) = fn(n-2) + fn(n-1) n>=2, 即后一个数等于前两个数之和

function fib(n) {
    const MOD = 1000000007;
    if (n < 2) return n;
    let left = 0,
        right = 1,
        sum = 0;
    for (let i = 1; i < n; i++) {
        sum = left + right;
        left = right
        right = sum
    }
    return sum % MOD;
}

剑指 Offer 10- II. 青蛙跳台阶问题

一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个 n级的台阶总共有多少种跳法。

答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。

解题思路 列出几种 就可以找出规律 和动态规划相同

function numWays(n) {
    if (n <= 1) return 1;
    const MOD = 1000000007;
    let left = 1,
        right = 1,
        sum = 0;
    for (let i = 1; i < n; i++) {
        sum = (left + right) % MOD;
        left = right
        right = sum
    }
    return sum;
}

剑指 Offer 63. 股票的最大利润

假设把某股票的价格按照时间先后顺序存储在数组中,请问买卖该股票一次可能获得的最大利润是多少?

解题思路 找出最大利润,及后面的减去前面的值的最大值 动态规划

  1. 遍历数组,申明两个变量,一个用来存取当前的最大利润,一个用来存取最小值
  2. 最大利润 = max(当前值 - 最小值,最大利润)
  3. 最小值则 = min(最小值,当前值)
  4. 返回最大利润
function maxProfit(prices) {
    let minprice = Number.MAX_VALUE;
    let maxprofit = 0;
    for (const price of prices) {
        maxprofit = Math.max(price - minprice, maxprofit);
        minprice = Math.min(price, minprice);
        console.log(price, maxprofit, minprice);
    }
    return maxprofit;

    // 暴力破解 不推荐
    // if (prices.length < 2) return 0;
    // let sum = 0;
    // for (let i = 0; i < prices.length - 1; i++) {
    //     for (let j = i + 1; j < prices.length; j++) {
    //         if (prices[j] - prices[i] > sum) {
    //             sum = prices[j] - prices[i]
    //         }
    //     }
    // }
    // return sum
}