Leetcode 1911 Maximum Alternating Subsequence Sum [Python]

从题目的例子来看,可以不太严谨的归纳出,属于正的部分都是给定nums序列中上升子序列的最后一位,属于负的部分都是给定nums序列中下降子序列的最后一位。从逻辑推导的角度来看,我们无论如何会选择一个数字作为最终子序列的开头,如果这个数字处于一个上升序列且位置是i,那这个上升序列中的任何i+j位置的数字都比i位置的数字大,且排列在后,两个数字相减为负。所以我们只能选择最后上升序列最后一位;如果i 位数字其处于下降序列中,则为了最后结果大,我们需要选择最大的数字,也就是i必须是下降序列的开头。开头的数字确定好之后,就是第二位数字了,需要减去的数字自然越小越好,而如果第一个数字是上升序列最后一位,之后是下降序列,则选择下降序列最后一个,如果开头数字是下降序列第一个,同理,第二个数字还是选择下降序列最后一个。于是奇偶位置的数字交替进行。直到最后一位。上升则加入,下降,则不取。

class Solution:
    def maxAlternatingSum(self, nums: List[int]) -> int:
        #dp[i][j]: the maxmum array we have for the i and j
        n = len(nums)
        if n == 1:return nums[0]
        pos = 0
        res = 0
        while True:
            while pos < n - 1 and nums[pos+1] > nums[pos]:
                pos += 1
            res += nums[pos]
            if pos == n - 1:
                break
            pos += 1
            while pos < n - 1 and nums[pos+1] <= nums[pos]:
                pos += 1
            if pos == n - 1:
                break
            res -= nums[pos]
        return res
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值