一次买卖 :
假设有一个数组,它的第i个元素是一支给定的股票在第i天的价格。
如果你最多只允许完成一次交易,设计一个算法来找出最大利润。
两种解题思路 :
1. 遍历 求第 i 天买进,第 j 天抛售最大值
源代码 :https://github.com/15936582283/nanmu/blob/master/TheBestBuy/onceOne
int max = 0;
for (int i = 0; i < arra.length; i++) {
for (int j = i + 1; j < arra.length; j++) {
int t = arra[j] - arra[i];
if (max < t)
max = t;
}
}
2 . 计算出股票亏损数组 即 arr[i+1] - arr[i],从第一个不为负数的日子买入,依次相加其后紧挨数组中的值,记录当前最大值,当和为负数时;从接下来不为负数的日子买入,依次相加记录最大值
源代码https://github.com/15936582283/nanmu/blob/master/TheBestBuy/onceTwo
int mx = 0; // 判断此时是否亏损
int max = 0; // 此时盈利最大
for (int i = 0; i < arra.length - 1; i++) {
mx += arra[i+1] - arra[i];
if(mx < 0) { //此时亏损,从第二天再买入股票
mx = 0;
continue;
}
if(max < mx)
max = mx;
}
多次买卖 :
给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。
设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。
注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。
arr[i+1] - arr[i] > 0 代表盈利,买(即相加) < 0 代表亏损 不买
源代码 :https://github.com/15936582283/nanmu/blob/master/TheBestBuy/many
int max = 0; // 盈利最大
for (int i = 0; i < arra.length - 1; i++) {
int t = arra[i+1] - arra[i];
if(t > 0) max += t;
}