Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
菜鸟就要从第8题继续
一、题目描述:
给定一个数组prices,其中prices[i]表示股票第 i 天的价格。 在每一天,你可能会决定购买和/或出售股票。你在任何时候最多只能持有一股股票。你也可以购买它,然后在同一天出售。返回你能获得的最大利润 。
来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/re… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
二、思路分析:
第一版:直观上理解,买入的时候应该是后一天比当天涨,且当天手里没有股票,卖出时应该是后一天比当天跌,且手里有股票(或者是最后一天,这个条件第一次写没考虑到)
实际这道题求的就是上升段一共有多高,因此采用贪心算法,只要计算后一天与当天的差值,大于0就累加进去即可,贪心计算简单,代码清晰,但并没有体现实际的购买方式。
这道题还可以采用动态规划的思路求解,但逻辑就要复杂的多,空间占用也比较多。通过两个数分别代表前一天是否拥有股票的最大收益,就可以从开始推求到最后一天卖掉股票的最大收益。
直观虽然代码复杂,但可以很清晰的获取是哪一天买入哪一天卖出,计算和空间也很不错。但贪心的代码就更清爽。而动态规划也有响应的算法思想。虽然题简单,但思想更重要。
三、AC 代码:
1、第一版
/**
* @param {number[]} prices
* @return {number}
*/
var maxProfit = function(prices) {
const n =prices.length
let shares =0
let buy =0
let sell =0
let result =0
for(let i=0;i<n;i++){
if(prices[i]<=prices[i+1]&&shares ==0){
buy=prices[i]
shares=1
}
else if((prices[i]>=prices[i+1]||i==n-1)&&shares ==1){
sell=prices[i]
shares=0
result=result+sell-buy
}
}
return result
};
2、贪心
/**
* @param {number[]} prices
* @return {number}
*/
var maxProfit = function(prices) {
const n =prices.length
let result =0
for(let i=0;i<n-1;i++){
result += Math.max(prices[i + 1] - prices[i], 0);
}
return result
};
3、动态规划
/**
* @param {number[]} prices
* @return {number}
*/
var maxProfit = function(prices) {
const n = prices.length;
let dp0 = 0, dp1 = -prices[0];
for (let i = 1; i < n; ++i) {
let newDp0 = Math.max(dp0, dp1 + prices[i]);
let newDp1 = Math.max(dp1, dp0 - prices[i]);
dp0 = newDp0;
dp1 = newDp1;
}
return dp0;
};