剑指offer之股票的最大利润

155 阅读1分钟

题目要求:在给定数组中求的买卖股票的最大利润(在当前情景中最小买进,最大卖出)

原题链接点这里

本文思路如下:

  1. 贪心法
  2. 动态规划法
  3. 根据大佬代码优化的动态规划法

贪心法(一遍遍历)

解题思路:走到每一步都考虑是否该从当前价格买进或者卖出

代码如下:

var maxProfit = function(prices) {
let min=prices[0]
let profit=0
for(let item of prices){
//每一次遍历都找到目前为止的最小值
min=Math.min(item,min)
//找到目前为止的最大利润
profit=Math.max(profit,item-min)
}
return profit
}

动态规划法

解题思路:前n天的最大利润=Math.max(前n-1天最大利润,第n天能实现的最大利润)

代码如下:

var maxProfit = function(prices) {
//dp[i]=Math.max(dp[i-1],cost-min)
let dp=[0]
let min=0
for(let i=1;i<prices.length;i++){
min=Math.min(prices[i],min)
dp[i]=Math.max(dp[i-1],prices[i]-min)
}
return dp[prices.length-1]
}

根据大佬代码优化的动态规划法

解题思路:根据第二种解法来看,dp这个数组好像并没有什么用,每次只需要拿到当前最大利润(前n天最大利润可以就写成一个变量) 代码如下:

var maxProfit = function(prices) {
//dp[i]=Math.max(dp[i-1],cost-min)
let dp=0
let min=0
for(let i=1;i<prices.length;i++){
min=Math.min(prices[i],min)
dp=Math.max(dp,prices[i]-min)
}
return dp
}

做出的优化:将一个数组改变成一个变量,节省了内存

解题总结:动态规划就是将问题由大化小,结果=上一步结果+这一步结果