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 精简代码

要使用MATLAB对给定的人口数据进行拟合并求解人口阻滞模型(Logistic模型),可以按照以下步骤操作: ### 步骤1:准备数据 首先将提供的年度和对应的数据输入到MATLAB中。 ```matlab years = [2017, 2018, 2019, 2020, 2021, 2022, 2023]; population = [13.9008, 13.9538, 14.0005, 14.1212, 14.126, 14.1175, 14.0967]; t = years - min(years); % 将时间起点设为0 P = population; ``` ### 步骤2:定义Logistic模型函数 创建一个自定义函数来表示Logistic增长方程。 ```matlab logisticFunc = @(b,t) b(1)./(1 + (b(1)/P(1)-1).*exp(-b(2)*t)); ``` 这里`b(1)`是承载容量\( K \),而`b(2)`是增长率\( r \)。 ### 步骤3:使用非线性最小二乘法拟合参数 利用MATLAB内置的`lsqcurvefit`或`nlinfit`函数来进行非线性曲线拟合以找到最优参数值。 ```matlab initialGuess = [max(P), 0.1]; % 初始猜测值 options = optimoptions('lsqcurvefit', 'Display', 'off'); [b, resnorm] = lsqcurvefit(logisticFunc, initialGuess, t, P); K = b(1); r = b(2); fprintf('最佳拟合参数: 承载容量(K)=%.4f, 增长率(r)=%.4f\n', K, r); ``` ### 步骤4:绘制结果 生成图表对比原始数据点与拟合后的Logistic曲线。 ```matlab figure; plot(t, P, 'o'); hold on; grid on; xlabel('Years from 2017'); ylabel('Population'); title('Logistic Model Fitting for Population Data'); t_future = (min(years):0.1:max([years, 2030])) - min(years); plot(t_future, logisticFunc(b, t_future), '-'); legend('Data Points', sprintf('Fitted Logistic Curve (K=%.2f)', K)); hold off; ``` ### 预测未来几年的增长情况 最后可以根据得到的最佳拟合参数对未来一段时间内的人口数量做出预测。 ```matlab future_years = 2024:2030; predicted_population = logisticFunc(b, future_years - min(years)); disp(table(future_years', predicted_population', 'VariableNames',... {'Year', 'Predicted_Population'})) ``` 以上就是在MATLAB中实现人口阻滞模型的方法概览。你可以直接在MATLAB环境中运行上述代码片段来完成整个过程。请注意调整初始参数估计以及检查优化结果的质量,必要时可微调设置获得更好的拟合效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值