给定一个数组 prices ,其中 prices[i] 表示股票第 i 天的价格。
在每一天,你可能会决定购买和/或出售股票。你在任何时候 最多 只能持有 一股 股票。你也可以购买它,然后在 同一天 出售。
返回 你能获得的 最大 利润 。


题解
方法一:贪心算法(针对这道问题的特殊解法)
贪心算法的直觉:由于不限制交易次数,只要今天股价比昨天高,就交易。
下面对这个算法进行几点说明:
该算法仅可以用于计算,但 计算的过程并不是真正交易的过程,但可以用贪心算法计算题目要求的最大利润。下面说明等价性:以 [1, 2, 3, 4] 为例,这 4 天的股价依次上升,按照贪心算法,得到的最大利润是:
res = (prices[3] - prices[2]) + (prices[2] - prices[1]) + (prices[1] - prices[0])
= prices[3] - prices[0]
仔细观察上面的式子,按照贪心算法,在下标为 1、2、3 的这三天,我们做的操作应该是买进昨天的,卖出今天的,虽然这种操作题目并不允许,但是它等价于:在下标为 0 的那一天买入,在下标为 3 的那一天卖出。
class Solution {
//贪心法:从前向后遍历,由于交易次数不受限制,只要今天比后一天小则今天买入,明天卖出
public int maxProfit(int[] prices) {
int profit=0;
for(int i=0;i<prices.length-1;i++){
//当遇到这种i+1,i-1的情况时,一定要注意循环的边界条件
if(prices[i]<prices[i+1]){
profit+=prices[i+1]-prices[i];
}
}
return profit;
}
}
贪心算法 在每一步总是做出在当前看来最好的选择。
「贪心算法」 和 「动态规划」、「回溯搜索」 算法一样,完成一件事情,是 分步决策 的;
「贪心算法」 在每一步总是做出在当前看来最好的选择,我是这样理解 「最好」 这两个字的意思:
「最好」 的意思往往根据题目而来,可能是 「最小」,也可能是 「最大」;
贪心算法和动态规划相比,它既不看前面(也就是说它不需要从前面的状态转移过来),也不看后面(无后效性,后面的选择不会对前面的选择有影响),因此贪心算法时间复杂度一般是线性的,空间复杂度是常数级别的;
这道题 「贪心」 的地方在于,对于 「今天的股价 - 昨天的股价」,得到的结果有 3 种可能:① 正数,② 0,③负数。贪心算法的决策是: 只加正数 。
方法二:动态规划法
1.dp[i][0]:第i天持有股票的最大利润,dp[i][1]:第i天没持有股票的最大利润
2.转移方程:
dp[i][0]=Math.max(dp[i-1][0],dp[i-1][1]-prices[i])
dp[i][1]=Math.max(dp[i-1][0]+prices[i],dp[i-1][1])
3.初始化:
dp[0][0]=-prices[0],dp[0][1]=0
4.返回值:
dp[len-1][1]
class Solution {
public int maxProfit(int[] prices) {
int[][] dp = new int[prices.length][2];
dp[0][0]=-prices[0];
//注意i从1开始
for(int i=1;i<prices.length;i++){
dp[i][0]=Math.max(dp[i-1][0],dp[i-1][1]-prices[i]);
dp[i][1]=Math.max(dp[i-1][0]+prices[i],dp[i-1][1]);
}
return dp[prices.length-1][1];
}
}
本文介绍了一种利用贪心算法解决股票买卖问题的方法,通过简单有效的策略实现最大利润的计算。
415

被折叠的 条评论
为什么被折叠?



