方法一:贪心策略(局部最优达到全局最优)
解题思路:
第i天买入,第j天卖出和第i天买入,第i+P天卖出所得的收益是一样的。例如:[1,2,3,4,5],最大收益是4,如果第一天买入,第二天卖出,同时再买入,第三天又卖出…和第一天买入,第五天卖出所得收益是一样的。这就是贪心策略,一局部最优达到全局最优
代码如下:
var maxProfit = function (prices) {
if (prices === null || prices.length === 0 ) return 0 // 没有收益
let point = 0
for (let i = 1; i < prices.length; i++) {
if (prices[i] > prices[i - 1]) {
point += prices[i] - prices[i - 1]
}
}
return point
}
方法二:动态规划法
解题思路:
1、第i天有两种操作:
卖出:前一天买入后,如果今天卖出能获得利润,就卖出,否者保持不变
买入:前一天卖出后,今天可按照prices[i]的价格买入,但买入之后的利润减少,就不买了
2、交换状态(Math.max() 一组数字内取最大值)
卖出:sell = Math.max(sell, buy + prices[i]);
买入:buy = Math.max(buy, lastSell - prices[i]);
var maxProfit = function (prices) {
if (prices === null || prices.length === 0 ) return 0 // 没有收益
let sell = 0 // 卖出的最大利润,第一次没有卖出,利润为0
let buy = -prices[0] // 买入的最大利润,第一次买入,所以为负数
for (let i = 1; i < prices.length; i++) {
const lasterSell = sell // 每次保存卖出的利润
sell = Math.max( // 取两者最大值为本次操作卖出的总利润
sell, // 如果上一次为卖出,这次没有股票可卖
buy + prices[i] // 如果上一次为买入,卖出利润为上一次的卖出利润加当前数字
)
buy = Math.max(
buy, // 如果上一次为买入,这次没有股票可买
lasterSell - prices[i] // 如果上一次为卖出,买入的利润 = 卖出的利润 - 当前数字
)
}
return Math.max(sell, buy)
}