题目描述:
给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。
如果你最多只允许完成一笔交易(即买入和卖出一支股票),设计一个算法来计算你所能获取的最大利润。
注意你不能在买入股票前卖出股票。
示例
输入: [7,1,5,3,6,4]
输出:5
定义:minval = min(minval,prices[i]) 当前的最小价格
maxp = max(maxp,prices[i]-minval) 当前的最大利润
class Solution(object): def maxProfit(self, prices): if (len(prices)<=1): return 0 minval=prices[0] maxp=0 for i in range(len(prices)): minval= min(minval,prices[i]) maxp= max(maxp,prices[i]-minval) return maxp
LeetCode(122)买卖股票的最佳时机2
题目描述:
给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。
设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。
注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。
示例
输入:[7,1,5,3,6,4]
输出:7
解析:
只买上升折线的股票,上升折线的低端为买入,高端为卖出
若存在连续上升折现,p(n)-p(1)=(p(n)-p(n-1))+(p(n-1)-p(n-2))+...+(p(2)-p(1)),p(1)为折线最低,p(n)为折线最高
等价于中间日当天卖出在买入,虽然与规则冲突,但结果一致
class Solution(object): def maxProfit(self, prices): n = len(prices) if n<=1: return 0 maxp = 0 for i in range(1,n): if prices[i]>prices[i-1]: tmp = prices[i]-prices[i-1] maxp += tmp return maxp
LeetCode(123)买卖股票的最佳时机3
题目描述:
给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格。
设计一个算法来计算你所能获取的最大利润。你最多可以完成 两笔 交易。
注意: 你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。
示例
输入:[3,3,5,0,0,3,1,4]
输出:6
输入:[1,2,3,4,5]
输出:4
输入:[7,6,4,3,1]
输出:0
解析:
dp1[i] = max(dp[i-1], prices[i] - minval) 从前往后遍历,表示第1天到第i天之间的最大利润(通过是否在第i天卖出确认);
dp2[i] = max(dp[i+1], maxval - prices[i]) 从后往前遍历,表示第i天到最后一天之间的最大利润(通过是否在第i天买进确认);
res = max(dp1 + dp2),(dp1 + dp2)[i] 正好表示从第1天到最后一天经过两次交易的最大利润,我们的目标是找到令总利润最大的i。
class Solution(object): def maxProfit(self, prices): n=len(prices) if n<=1: return 0 elif n==2: if prices[1]<prices[0]: return 0 else: return prices[1]-prices[0] else: dp1 = [0 for _ in range(n)] dp2 = [0 for _ in range(n)] minval = prices[0] maxval = prices[-1] for i in range(1,n): minval=min(minval,prices[i]) dp1[i]=max(dp1[i-1],prices[i]-minval) for j in range(n-2,-1,-1): maxval = max(maxval,prices[j]) dp2[j] = max(dp2[j+1],maxval-prices[j]) dp = [dp1[i]+dp2[i] for i in range(n)] return max(dp)
LeetCode(714)买卖股票的最佳时机含手续费
题目描述:
给定一个整数数组 prices,其中第 i 个元素代表了第 i 天的股票价格 ;非负整数 fee 代表了交易股票的手续费用。
你可以无限次地完成交易,但是你每次交易都需要付手续费。如果你已经购买了一个股票,在卖出它之前你就不能再继续购买股票了。
返回获得利润的最大值。
示例
输入:prices = [1, 3, 2, 8, 4, 9], fee = 2
输出:8
class Solution(object): def maxProfit(self, prices, fee): n = len(prices) if n < 2: return 0 ans = 0 #记录着低谷 valley = prices[0] for i in range(1, n): #发现更低的谷,弃前谷 if prices[i] < valley: valley = prices[i] # prices[i]-fee:扣掉手续费的峰 # 发现一个扣掉手续费的峰比谷高 elif prices[i]-fee > valley: #累积差 ans += (prices[i]-fee)-valley #此扣掉手续费的峰当作新谷 #考虑连续增时,只要第一段判断付得起手续费就好 valley = prices[i]-fee print("valley: ",valley) return ans
原文地址:https://www.cnblogs.com/fighting25/p/11519581.html