丑话说在最前面:股市有风险!股市有风险!股市有风险!股市有风险!股市有风险!股市有风险!
题目
买卖股票的最佳时机 II
给定一个数组 prices ,其中 prices[i] 是一支给定股票第 i 天的价格。设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。
注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。
作者:力扣 (LeetCode)
链接:https://leetcode-cn.com/leetbook/read/top-interview-questions-easy/x2zsx1/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
一、分析
先分析下一共会有的情况:1是股票价格涨跌,2是你当时有没有买股票。
结合起来一共就是4种:
1)股票要跌,你没买,皆大欢喜。
2)股票要跌,你之前买了,赶紧卖。
3)股票要涨,你没买,买它买它买它!
4)股票要涨,你之前买过了。(需要判定是否到边界)
5)总结就是今天这个价格买不买,要看明天涨不涨(现实中要有这个本事,也不会被叫韭菜了),明天能涨,那我们就今天买,明天卖,题目规定可以多次买卖(现实中这是要交手续费、印花税的),所以就这么个简单逻辑就行。
二、代码
/**
* 买卖股票的最佳时机 II
* 给定一个数组 prices ,其中 prices[i] 是一支给定股票第 i 天的价格。
* 设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。
* 注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)
*/
public class LcLearn02 {
public static void main(String[] args) {
//7, 1, 5, 3, 6, 4
//1,2,3,4,5
//7,6,4,3,1
int[] a = new int[]{1, 2, 3, 4, 5};
int sum = 0;//利润
boolean isBuy = false;//是否已购买股票
int money = 0;//已购买股票金额
for (int i = 0; i < a.length - 1; i++) {
if (a[i] < a[i + 1]) {//涨价
if (!isBuy) {//之前没买过
System.out.println("要涨,买入价" + a[i]);
isBuy = true;
money = a[i];
} else {//之前买过了
if (i + 1 == a.length - 1) {//明天世界末日了,套现潇洒过最后一天
System.out.println("明天世界末日,潇洒去");
sum += (a[i + 1] - money);
}
}
} else {//跌
if (!isBuy) { //没买过股票,内心平静
System.out.println("要跌,不动");
} else { //已买过股票,明天要跌,赶紧出手
System.out.println("要跌了,再不卖就亏了" + a[i]);
sum += (a[i] - money);
money = 0;//卖出股票 清空金额
}
}
}
System.out.println("赚到" + sum);
}
}