Leetcode 1911 最大子序列交替和

题目

一个下标从 0 开始的数组的 交替和 定义为 偶数 下标处元素之 和 减去 奇数 下标处元素之 和 。

比方说,数组 [4,2,5,3] 的交替和为 (4 + 5) - (2 + 3) = 4 。
给你一个数组 nums ,请你返回 nums 中任意子序列的 最大交替和 (子序列的下标 重新 从 0 开始编号)。

一个数组的 子序列 是从原数组中删除一些元素后(也可能一个也不删除)剩余元素不改变顺序组成的数组。比方说,[2,7,4] 是 [4,2,3,7,2,1,4] 的一个子序列(加粗元素),但是 [2,4,2] 不是。

样例1

输入:nums = [4,2,5,3]
输出:7
解释:最优子序列为 [4,2,5] ,交替和为 (4 + 5) - 2 = 7 。

样例2

输入:nums = [5,6,7,8]
输出:8
解释:最优子序列为 [8] ,交替和为 8 。

样例3

输入:nums = [6,2,1,2,4,5]
输出:10
解释:最优子序列为 [6,1,5] ,交替和为 (6 + 5) - 1 = 10 。

数据范围

1 <= nums.length <= 105
1 <= nums[i] <= 105

题目链接:https://leetcode-cn.com/problems/maximum-alternating-subsequence-sum/

题解

参考Leetcode题解,发现有一个方法很巧妙。将样例[6,2,1,2,4,5]转化为[0,6,2,1,2,4,5],那么题面就转化为模拟股票交易,数组中的数为股票价格,index为天数。
你可以在第i天买入股票,第j天卖出股票,其中i<=j。

那么其实我们可以用上帝视角来看,只要股票价格后一天比当天高,我们就当天买入,后一天卖出。
那么就如下所示:

买入    卖出    收益
第0天   第1天   6-0=6
第3天   第4天   2-1=1
第4天   第5天   4-2=2
第5天   第6天   5-4=1  

那么总收益为6+1+2+1=10,即6-0+2-1+4-2+5-4,抵消之后就是6-1+5,就是样例中的最优子序列[6,1,5]~

AC代码

class Solution {
public:
    long long maxAlternatingSum(vector<int>& nums) {
        nums.insert(nums.begin(), 0);
        long long sum = 0;
        for(int i = 1; i < nums.size(); i ++){
            if(nums[i]-nums[i-1] > 0) sum += nums[i]-nums[i-1];
        }
        return sum;
    }
};

看到这里,你学废了吗~
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值