【动态规划】- js 求解买卖股票问题

121. 买卖股票的最佳时机

给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。如果你最多只允许完成一笔交易(即买入和卖出一支股票一次),设计一个算法来计算你所能获取的最大利润。注意:你不能在买入股票前卖出股票。

示例 1:
输入:[7,1,5,3,6,4]
输出:5
解释:在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。
注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格;同时,你不能在买入前卖出股票。

示例2
输入:prices = [7,6,4,3,1]
输出:0
解释:在这种情况下, 没有交易完成, 所以最大利润为 0。

1. 直接遍历

我们需要对股票进行一次买入、一次卖出,卖出在买入之后,并且要计算最大的利润。

这里初始化一个最小值min,和一个最大的结果值max。遍历数组,如果当前数组元素小于最小值民,就更新最小值,始终让其保持最小。如果当前值减去最小值大于最大值,就更新最大值。直到遍历完数组所有的元素,返回最后的结果。

2. 动态规划

对于这道题,我们可以使用动态规划来解决。这里我们只需要进行一次买入卖出。那到最后交易时,可能会有三种状态:

  • dp[0]:一直没有买
  • dp[1]::到最后只买了一笔,未卖出
  • dp[2]::到最后只卖了一笔,并卖出

由于第一种状态未进行任何操作,所以可以不用记录。然后我们对后两种状态进行转移:

  • dp[1] = Math.max(dp[1], -prices[i]):前一天也是b1状态或者是没有任何操作,今天买入一笔变成b1状态;
  • dp[2] = Math.max(dp[2], dp[1] + prices[i]):前一天也是s1状态或者是b1状态,今天卖出一笔变成s1状态;

(1)直接遍历

/**
 * @param {number[]} prices
 * @return {number}
 */
var maxProfit = function(prices) {
    let max = 0
    let min = prices[0]

    prices.forEach( item => {
        if(item < min) min = item
        if(item - min > max) max = item - min
    })
    return max
};

复杂度分析:

  • 时间复杂度: O(n),其中n是数组的长度,我们需要将数组遍历一遍
  • 空间复杂度: O(1),这里只需要常数空间来储存最小值min和最大结果值max

(2)动态规划

/**
 * @param {number[]} prices
 * @return {number}
 */
var maxProfit = function(prices) {
    let len = prices.length;
    const dp = [0, -prices[0], 0]
    
    for (let i = 1; i < len; i++) {
        dp[1] = Math.max(dp[1], -prices[i])
        dp[2] = Math.max(dp[2], dp[1] + prices[i])
    }
    return dp[2];
}

复杂度分析:

  • 时间复杂度:O(n),其中 n 是数组 prices 的长度。
  • 空间复杂度:O(1)。

活动地址:CSDN21天学习挑战赛

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
很不错的抓包工具 捕包选项 1、选择好捕包网卡,左连还有一些其它捕包条件供选择,如果当所选网卡不支持“杂项接收”功能,系统会提示相应信息,出现该情况时您将无法获取与本网卡无关的数据包,换言之,您无法获取其他电脑之间的通讯包,所以, 建议您更换网卡。 不支持“杂项接收”的网卡,多数为一部分无线网卡及少数专用服务器/笔记本网卡。 2、协议过滤 通常情况下,可不选,除非您对协议类型较为熟悉。 3、设置捕包缓冲 确省的捕包缓冲区大小为 1M,如果您的要追踪的网络规模较大,可适当调大该值;另外,如果追踪主机 CPU 处理能力不够,也需加大缓冲;否则,可能出现丢包的情况。 4、IP过滤 IP过滤里可以设置想要捕包的IP地址或是设置要排除的IP地址等信息。 5、端口过滤 端口过滤过滤里可以设置想要捕包的端口或是设置要排除过滤的端口等信息。 捕包分析 1、设置捕包过滤项 这里的过滤和“追踪任务”过滤设置是独立分开的,请不要混淆,其可选内容项更多。 上述选项中,最为复杂的是“数据块匹配”部分,详细的介绍将在下面的章节部分出现,这里只需要配置好正确的网卡即可,其他选项可以不做任何设置。 IP包回放 1、有助于了解原始包通讯的地理分布情况。 2、通过将IP包回放到网卡上,模拟原始IP包在网络上传输情况,也可供同类捕包软件捕获分析。 通讯协议分析 捕包准备 捕包分析工具条: 开始捕包前,用户需先进行过滤设置,选项内容包括: 选网卡 如果您有多块网卡,需要选中能捕包到预想中的数据的网卡。 协议过滤 针对Internet通讯部分,常见的IP包类型为:TCP/UDP/ICMP。绝大部分是TCP连接的,比如HTTP(s)/SMTP/POP3/FTP/TELNET等等;一部分聊天软件中除了采用TCP通讯方式外,也采用了UDP的传输方式,如QQ/SKYPE等;而常见的ICMP包是由客户的Ping产生的。 IP过滤 “IP过滤”在捕包过滤使用最为常见,IP匹配主要分两类:一是不带通讯方向,单纯的是范围的匹配,如上图中的“From:to”类型;另外一类是带通讯方向的一对一匹配,如上图“”类型,不仅匹配IP地址,也匹配通讯的源IP和目标IP的方向。 端口过滤 “端口过滤”只针对两种类型的DoD-IP包:TCP/UDP。 数据区大小 “数据区大小” 的匹配针对所有DoD-IP类型包,不过需要说明的是,TCP/UDP的IP数据区是以实际数据区位置开始计算的,而其他类型的则把紧随IP包头后面的部分当作数据区。 数据块匹配 “数据块匹配”较为复杂,但却非常有用. 在这里,用户可以输入文本,也可以输入二进制,可以选择特定位置的匹配,也可以选择任意位置的匹配,总之,该设置非常灵活好用。 结束条件 缺省条件下,当捕获的包占用空间多余10M时,自动停止。 结束于某个时间点,是指捕包的截止时间。 分析捕获包 用户按下“开始”按钮启动捕包功能后,列表框中会自动显示出符合条件的数据包,并附带简单的解析。选中“分析”左边和右下部分是分析结果,右上部是原始二进制代码,选中左边某一条目时,在右边二进制区域的色块和其一一对应。 如果用户以前少有接触协议分析部分,Tracknet可以很好地协助您深入了解TCP/IP协议。我们将在网站定期提供一些捕获样例包,协助用户学习分析各种类型的IP包。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值