每日挑战(C++版)
在这里,我将开始每天练习LeetCode算法题,并将个人解决方案放在这里。
需求介绍
给你一个整数数组 prices
,其中 prices[i]
表示某支股票第 i
天的价格。
在每一天,你可以决定是否购买和/或出售股票。你在任何时候最多只能持有 一股 股票。你也可以先购买,然后在 同一天 出售。
返回 你能获得的最大 利润 。
要求
1 <= prices.length <=
0 <= prices[i] <=
个人分析
从需求中可以看到,第二段话至关重要。你在任何时候最多只能持有一股股票 限定了购买条件,对应到数组中表现为只需要对数组进行一次遍历即可,不需要重复考虑每天股价之间的差值。你也可以先购买,然后在同一天出售 只需要考虑当天的股价是否高于入手时的股价,不需要考虑后续还会不会上涨。因此这是一道非常典型的贪心算法。
贪心的运用在,只需要关注今天的股价比昨天的高就抛售,今天的股价如果比昨天低,就存有的是今天的股票,而不是昨天的股票。(感觉这个例子不合适hhh,没有人能预知明天的股价比今天底,所以今天就把股票出了)。对应在数组里就是,prices[i] > prices[i-1],那么抛售,利润为prices[i] - prices[i-1]。否则第i天没有利润,且手上的股票变为第i天的股价。
例如:
- prices[7, 1, 5, 3, 4, 6]。
- 第一次赚钱是第1天买,第2天卖,利润+4。
- 第二次赚钱是第3天买,第4天卖,利润+1。
- 第三次赚钱是第4天买,第5天卖,利润+2。
- 总利润为7。
在上面这里例子中,可以第3天买,第5天卖,利润为3,但是总利润是相同的,因此没有必要考虑隔天的情况,只需要对当天和前一天进行判断即可。这就是这道题的贪心之处。
代码实现
class Solution {
public:
int maxProfit(vector<int>& prices) {
int result = 0;
for(int i = 1; i < prices.size(); i++)
result += max(0, prices[i] - prices[i-1]);
return result;
}
};
总结
上诉代码在时间上超过了89.86%的用户,内存上超过了24.24%的用户。