O(n)时间求解最佳交易模型

Say you have an array for which the ith element is the price of a given stock on day i.

If you were only permitted to complete at most one transaction (ie, buy one and sell one share of the stock), design an algorithm to find the maximum profit.

给了一个由物品价格组成的时间序列如,(1,3,2,4)第一天价格为1,第二天价格为3,其他同理,求解如何买卖可以获利最大

要注意的是买的时间一定在卖的时间之前,于是该题就变成了当i<j时,最大的(aj-ai)值

第一想法是通过遍历元素,每个元素都与后面的元素进行比较,时间复杂度自然是O(n**2)

但是这道题可以采用另一种思路,设置最大收益benefit和已经找到的最小值mini,每个新来的元素与mini相减与benefit比较,同时元素与之前最小值mini比较,如此下来一次遍历便可以求解该问题

代码如下:

class Solution(object):
    def maxProfit(self, prices):
        """
        :type prices: List[int]
        :rtype: int
        """
        bene,mini=0,float('inf')
        for i in prices:
            mini=min(mini,i)
            bene=max(bene,i-mini)
        return bene

其中注意 mini设置为无穷大,bene设置为0

同时使用min和max函数避免使用if 精简代码

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
首先,我们需要定义SIR模型以及损失函数。在SIR模型中,有三个参数需要估计:初始感染人数I0,感染率beta,恢复率gamma。损失函数可以定义为模型输出与实际数据之间的平方误差。 下面是一个基于神经网络的求解SIR模型参数的MATLAB代码示例: ``` % 定义SIR模型 function dydt = SIR(t, y, beta, gamma) S = y(1); I = y(2); R = y(3); N = S + I + R; dSdt = -beta*S*I/N; dIdt = beta*S*I/N - gamma*I; dRdt = gamma*I; dydt = [dSdt; dIdt; dRdt]; % 定义损失函数 function loss = SIR_loss(params, t, y) I0 = params(1); beta = params(2); gamma = params(3); [t, y_model] = ode45(@(t,y)SIR(t,y,beta,gamma), t, [1-I0; I0; 0]); loss = sum((y(:,2) - y_model(:,2)).^2); % 定义优化函数 options = optimset('MaxIter', 1000, 'TolFun', 1e-6); params0 = [0.1, 0.5, 0.1]; % 初始参数值 [t, y] = getData(); % 获取实际数据 params = fminsearch(@(params)SIR_loss(params, t, y), params0, options); % 绘制结果 I0 = params(1); beta = params(2); gamma = params(3); [t, y_model] = ode45(@(t,y)SIR(t,y,beta,gamma), t, [1-I0; I0; 0]); plot(t, y(:,2), 'o', t, y_model(:,2), '-') xlabel('t') ylabel('I(t)') legend('实际数据', '模型拟合') ``` 在这个示例中,我们首先定义了SIR模型和损失函数。然后,我们使用fminsearch函数来最小化损失函数,并获取最佳模型参数。最后,我们使用最佳参数来计模型输出,并将其与实际数据进行比较。 需要注意的是,这只是一个简单的示例,实际应用中可能需要更复杂的模型和更多的参数。此外,神经网络的训练和优化可能需要更复杂的技巧和工具,如交叉验证、正则化等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值