Featured image of post 1911. 最大子序列交替和

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

解法一:一次遍历

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
func maxAlternatingSum(nums []int) int64 {
    n := len(nums)
    if n < 2 {
        return int64(nums[0])
    }
    var ans int64 = 0
    for i := 1; i < n; i++ {
        if nums[i-1] > nums[i] {
            ans += int64(nums[i-1] - nums[i])
        }
    }
    // j := n - 1
    // for j > 0 && nums[j-1] > nums[j] {
    //   j--
    // }
    // ans = ans - (nums[j]-nums[n-1])+nums[j]
    // 上面代码简化为如下一行代码
    ans = ans + int64(nums[n-1])
    return ans
}
Licensed under CC BY-NC-SA 4.0
最后更新于 2023/07/22 13:07:47
comments powered by Disqus
Built with Hugo
主题 StackJimmy 设计