https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-ii/
给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。
设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。
注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。
示例 1:
输入: [7,1,5,3,6,4]
输出: 7
解释: 在第 2 天(股票价格 = 1)的时候买入,在第 3 天(股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 。
随后,在第 4 天(股票价格 = 3)的时候买入,在第 5 天(股票价格 = 6)的时候卖出, 这笔交易所能获得利润 = 6-3 = 3 。
示例 2:
输入: [1,2,3,4,5]
输出: 4
解释: 在第 1 天(股票价格 = 1)的时候买入,在第 5 天 (股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 。
注意你不能在第 1 天和第 2 天接连购买股票,之后再将它们卖出。
因为这样属于同时参与了多笔交易,你必须在再次购买前出售掉之前的股票。
示例 3:
输入: [7,6,4,3,1]
输出: 0
解释: 在这种情况下, 没有交易完成, 所以最大利润为 0。
小菜鸡的尝试:
思路比较明确,找到每一段上升段,上升段的起点是买入点,上升段的重点是卖出点。于是开始写代码,然后代码三分钟debug十分钟。思路虽简单,但还是有一些需要注意的细节:
- 只有在买入了前提才能卖出,只有在卖出以后才能买入
- 如果传入参数的长度为0或1,直接输出利润为0
- 注意不等号钟能否取等(容易落下情况)
- 如果第一天比第二天小,强制性买入
- 如果到了最后一天还是没有满足卖出条件,强制性卖出
1 class Solution {
2 public:
3 int maxProfit(vector<int>& prices) {
4 int profit = 0;
5 int inPrice;
6 int size = prices.size();
7 int i;
8 int flag = 0; // 标记是否处于买入状态 (1为买入状态)
9 if (size == 0 || size == 1) return 0;
10 if (prices[0] <= prices[1]) {
11 inPrice = prices[i];
12 flag = 1;
13 }
14 for (i = 1; i < size - 1; i ++) {
15 if (prices[i - 1] >= prices[i] && prices[i] <= prices[i + 1] && flag == 0) {
16 inPrice = prices[i];
17 flag = 1;
18 } else if (prices[i] <= prices[i + 1] && flag == 1) {
19 continue;
20 } else if (flag == 1){
21 profit = profit + prices[i] - inPrice;
22 flag = 0;
23 }
24 }
25 if (flag == 1) {
26 profit = profit + prices[i] - inPrice;
27 flag = 0;
28 }
29 return profit;
30 }
31 };
当然,对这个代码还是不满意,觉得不是很优雅,需要考虑的琐碎情况有点多,于是参看了大佬的代码
膜拜大佬代码:
害,我的思路被买卖股票钉死了。虽然大佬的贪心理念和我一样,但他没有被买卖这个操作钉死,所以代码就非常简洁优雅。
虽然利益等于卖出和买入价格差,去掉场景也可以理解为增量值(就是每次增量的总和,因此每每有增量就累计一次,没有增量就不需要累计),简单明了
1 class Solution {
2 public:
3 int maxProfit(vector<int>& prices) {
4 int profit = 0;
5 int size = prices.size();
6 for (int i = 0; i < size - 1; i++) {
7 int diff = prices[i + 1] - prices[i];
8 if (diff > 0) {
9 profit += diff;
10 }
11 }
12 return profit;
13 }
14 };
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。