列表

详情


1911. 最大子序列交替和

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

给你一个数组 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 。

 

提示:

原站题解

去查看

上次编辑到这里,代码来自缓存 点击恢复默认模板
class Solution { public: long long maxAlternatingSum(vector<int>& nums) { } };

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
}

上一题