假设把某股票的价格按照时间先后顺序存储在数组中,请问买卖该股票一次可能获得的最大利润是多少?
示例 1:
输入: [7,1,5,3,6,4]
输出: 5
解释: 在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。
注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格。
示例 2:
输入: [7,6,4,3,1]
输出: 0
解释: 在这种情况下, 没有交易完成, 所以最大利润为 0。
限制:
0 <= 数组长度 <= 10^5
交易一次获得的最大利润:
//交易一次,股票交易最大收益。此方法是网上找到的,出处不记得了
func maxProfitOneDeal(prices []int) (profit int) {
if len(prices) == 0 {
return 0
}
in, out := prices[0], prices[0]
for index, price := range prices {
if price < in {
in = price
out = 0
} else if price > out {
out = price
if out-in > profit {
profit = out - in
}
}
}
fmt.Println("profit", profit)
return profit
}
交易多次获得的最大利润:
//for 循环中除去了第一天和最后一天的股票价格,求数组中的极大值和极小值。
极小值点买入,极大值点卖出;最后一天股票价格如果>买入价格,则最后一天卖出(最后面极小值点买入,未出现极大值点,那就是最后一天卖出)。利润最大。(数学中求极值思想)
//可交易多次,股票交易最大收益
func maxProfitMultiDeal(prices []int) (profit int) {
if len(prices) == 0 {
return 0
}
buy := prices[0] //买入初始值为第一天的股票价格
for i := 1; i < len(prices)-1; i++ {
//如果第i天的股票价格是极小值,赋值给buy,作为买入价格
if prices[i]-prices[i-1] <= 0 && prices[i]-prices[i+1] <= 0 && prices[i] < buy {
buy = prices[i]
// log.Info("buy in第 i天", i)
} else if prices[i]-prices[i-1] > 0 && prices[i]-prices[i+1] >= 0 && prices[i]-buy > 0 {//极大值点卖出
profit += (prices[i] - buy)
// log.Info("sell out i天", i)
buy = prices[i+1]
} else if i == len(prices)-2 && prices[i+1]-buy > 0 {//判断最后一天股票价格是不是大于买入价格,如果是就卖出。
profit += (prices[i+1] - buy)
// log.Info("sell out i天", i+1)
}
}
log.Info("profit", profit)
return profit
}