题目要求:在给定数组中求的买卖股票的最大利润(在当前情景中最小买进,最大卖出)
本文思路如下:
- 贪心法
- 动态规划法
- 根据大佬代码优化的动态规划法
贪心法(一遍遍历)
解题思路:走到每一步都考虑是否该从当前价格买进或者卖出
代码如下:
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
}
做出的优化:将一个数组改变成一个变量,节省了内存
解题总结:动态规划就是将问题由大化小,结果=上一步结果+这一步结果