最大回撤

# -*- coding: utf-8 -*-
# @Time         : 2019-09-27 22:09
# @Author       : Jayce Wong
# @ProjectName  : job
# @FileName     : maxRetreat.py
# @Blog         : http://blog.51cto.com/jayce1111
# @Github       : https://github.com/SysuJayce


"""
题目形式:有一个数组,求其中两个数x,y,满足x的索引小于y的索引,使得 x-y 最大。
例如 arr = [3,7,2,6,4,1,9,8,5], 最大回撤是6,对应的x=7,y=1。
"""


def maxRetreat(nums):
    """
    到了现在,我们应该对这种最大最小的最优化类的题目有一定的敏感度,知道要用动态规划。
    由于输入是一维数组,我们可以用一个一维数组来保存子问题的状态。
    dp[i]表示下标为i的元素的最大回撤
    那么转移方程为:
            dp[i+1] + nums[i] - nums[i+1], if dp[i + 1] > 0
    dp[i] = 
            nums[i] - nums[i+1], else
            
    其实这种题目我们应该做的就是使用一个例子来模拟一遍。如果我们从前往后计算每个下标的最大回撤,那
    么会有很多重复计算的子问题,这一点类似于字符串解码的问题。而如果我们从后往前来计算每个下标的最
    大回撤,那么就可以利用到已经计算出来的子问题的解。
    而这个状态转移方程也是基于观察得到的。
    
    :param nums: 待计算最大回撤的数组
    :return: 输入的数组的最大回撤
    """
    if not nums:
        return 0
    dp = [0] * len(nums)
    maxRet = 0  # 可以用一个变量来保存全局最大的回撤的值,也可以不用,但是这样可以节省一次遍历
    for i in range(len(nums) - 2, -1, -1):
        if dp[i + 1] > 0:
            dp[i] = dp[i + 1] + nums[i] - nums[i + 1]
        else:
            dp[i] = nums[i] - nums[i + 1]
        maxRet = max(maxRet, dp[i])

    return maxRet


print(maxRetreat([3, 7, 2, 6, 4, 1, 9, 8, 5]))

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值