6月28日算法日记

113 阅读2分钟

1.买卖股票的最佳时机

image-20220628202503548

解法

1.动态规划

思路

如果想要利润最大化,那么就需要得到买入股票时的最小值,以及卖出股票时的价格最大值

首先定义变量min = infinity为无穷大,min表示股票售价最小值;定义变量dp初始化为0,表示股票在当前时机卖出时的最大利润

在循环中每次比较当天股票和前一天股票的价格,并且取最小值min = Math.min(min, prices[i]);然后比较当天卖出股票的利润和前一天卖出股票的利润取最大值dp = Math.max(dp, prices[i] - min)

最后返回dp,如果dp没有利润会返回初始值0

主要思想

  1. 记录今天之前买入股票的股价最小值min
  2. 记录今天之前买入股票且今天卖出股票得到的利润dp=prices[i] - min
  3. 比较今天之前的利润dp和当天卖出股票的利润prices[i] - min取最大值
var maxProfit = function(prices) {
    //定义一个dp 表示当天卖出股票的利润最大值
    let dp = 0
    //定义一个min 表示当天买入股票时的股价最小值
    let min = Infinity
    let length = prices.length
    for(let i = 0; i < length; i++) {
        min = Math.min(min, prices[i])
        dp = Math.max(dp, prices[i] - min)
    }
    return dp
};

2.使用最小花费爬楼梯

image-20220628212019142

解法

1.动态规划

思路

  1. 定义dp是长度为n+1的数组(因为只有经过了数组最后一位才算到达终点),dp[i]表示跳到第i个台阶总共需要的花费
  2. 由于选择第一个或者第二个阶梯是不消耗费用的,因此dp[0] = dp[1] = 0,因此从遍历的时候可以从第三阶台阶开始也就是i=2开始且i<n+1,因为第n个元素才算作为终点
  3. 递推公式:dp[i] = Math.min(dp[i-1]+cost[i-1], dp[i-2]+cost[i-2]),跳上当前台阶所需要的花费为前一个台阶所需的花费和前两个台阶所需的花费作比较取最小值
  4. 另外dp[i-1]为什么需要加上cost[i-1],因为从i-1这个位置跳到下一个位置需要花费cost[i-1]的费用,因此需要加上
var minCostClimbingStairs = function(cost) {
    let n = cost.length
    let dp = new Array(n+1)
    dp[0] = dp[1] = 0
    for(let i = 2; i < n+1; i++) {
        dp[i] = Math.min(dp[i-1]+cost[i-1], dp[i-2]+cost[i-2])
    }
    return dp[n]
};