题目
一个下标从 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;
}
};
看到这里,你学废了吗~