题目描述:
给你一个整数数组
prices
,其中prices[i]
表示某支股票第i
天的价格。在每一天,你可以决定是否购买和/或出售股票。你在任何时候 最多 只能持有 一股 股票。你也可以先购买,然后在 同一天 出售。
返回 你能获得的 最大 利润 。
输入:prices = [7,1,5,3,6,4] 输出:7 解释:在第 2 天(股票价格 = 1)的时候买入,在第 3 天(股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5 - 1 = 4 。 随后,在第 4 天(股票价格 = 3)的时候买入,在第 5 天(股票价格 = 6)的时候卖出, 这笔交易所能获得利润 = 6 - 3 = 3 。 总利润为 4 + 3 = 7 。
解题思路:
- 一开始我想的是只要出现递减就重新开始计算买入的价格,但是实现的复杂了,后来代码一看其实就是只要涨了就不用管,比如:1,5,6 不用非得找到这个6减去1,用5减去1加上6减去1,实际上差值相加是一样的,只要是涨的。只要有的赚就都卖。
- 后来看到还可以用动态规划来计算,就是我今天只有两种情况,要么昨天价格比今天低,我马上卖掉,要么昨天价格比今天高,我不买,相当于今天赚了0块钱,到今天为止我总共的收益 = 我今天转的钱 + 我昨天赚的总的收益,所以dp 每一个元素都记录前一天的总的收益 + 今天赚的钱。
解法一:贪心算法
function maxProfit(prices) {
let sum = 0
for (let i = 1; i < prices.length; i++) {
if (prices[i] > prices[i - 1]) {
sum += prices[i] - prices[i - 1];
}
}
return sum;
}
用时:
// 时间 68 ms 击败 72.46%
// 内存 42.5 MB 击败 92.17%
解法二:动态规划
function maxProfit(prices) {
let dp = [0];
for (let i = 1; i < prices.length; i++) {
// 当天的收益
let profit = prices[i] - prices[i-1] > 0 ? prices[i] - prices[i-1] : 0
// 当天总的收益 = 前一天总的收益 + 今天的收益
dp[i] = dp[i - 1] + profit;
}
return dp[prices.length - 1];
}
用时:
// Your runtime beats 87.83 % of typescript submissions
// Your memory usage beats 33.04 % of typescript submissions (44.3 MB)