class Solution {
public:
long long maxAlternatingSum(vector<int>& nums) {
}
};
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
原站题解
golang 解法, 执行用时: 116 ms, 内存消耗: 8.7 MB, 提交时间: 2022-12-08 11:17:04
func maxAlternatingSum(nums []int) int64 { n := len(nums) odd, even := 0, nums[0] for i := 1; i < n; i++ { odd, even = max(even - nums[i], odd), max(odd + nums[i], even) } return int64(even) } func max(x, y int) int { if (x > y) { return x }; return y }
cpp 解法, 执行用时: 144 ms, 内存消耗: 88.9 MB, 提交时间: 2022-12-08 11:15:26
class Solution { public: long long maxAlternatingSum(vector<int>& nums) { int n = nums.size(); long long odd = 0, even = nums[0]; for (int i = 1; i < n; ++i) { tie(odd, even) = tuple{max(even - nums[i], odd), max(odd + nums[i], even)}; } return even; } };
python3 解法, 执行用时: 1204 ms, 内存消耗: 29.1 MB, 提交时间: 2022-12-08 11:15:10
class Solution: def maxAlternatingSum(self, nums: List[int]) -> int: n = len(nums) odd, even = 0, nums[0] # odd, 奇数位, even 偶数位 for i in range(1, n): odd, even = max(even - nums[i], odd), max(odd + nums[i], even) return even
golang 解法, 执行用时: 116 ms, 内存消耗: 8.7 MB, 提交时间: 2022-12-08 11:13:56
func maxAlternatingSum(nums []int) int64 { f := [2]int{0, math.MinInt64 / 2} // 除 2 防止计算时溢出 for _, v := range nums { f = [2]int{max(f[0], f[1]-v), max(f[1], f[0]+v)} } return int64(f[1]) } func max(a, b int) int { if a > b { return a } return b }