LeetCode算法题目:股票交易最大利润

17 篇文章 0 订阅

假设把某股票的价格按照时间先后顺序存储在数组中,请问买卖该股票一次可能获得的最大利润是多少?

示例 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
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值