Skip to content

Files

Latest commit

5c6efdc · Dec 31, 2022

History

History
162 lines (122 loc) · 3.82 KB

File metadata and controls

162 lines (122 loc) · 3.82 KB

English Version

题目描述

子数组是以0下标开始的数组的连续非空子序列,从 ij0 <= i <= j < nums.length)的 子数组交替和 被定义为 nums[i] - nums[i+1] + nums[i+2] - ... +/- nums[j]

给定一个以0下标开始的整数数组nums,返回它所有可能的交替子数组和的最大值。

 

示例 1:

输入:nums = [3,-1,1,2]
输出:5
解释:
子数组 [3,-1,1]有最大的交替子数组和3 - (-1) + 1 = 5.

示例 2:

输入:nums = [2,2,2,2,2]
输出:2
解释:
子数组 [2], [2,2,2]和 [2,2,2,2,2]有相同的最大交替子数组和为2
[2]: 2.
[2,2,2]: 2 - 2 + 2 = 2.
[2,2,2,2,2]: 2 - 2 + 2 - 2 + 2 = 2.

示例 3:

输入:nums = [1]
输出:1
解释:
仅有一个非空子数组,为 [1],它的交替子数组和为 1

 

提示:

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

解法

方法一:动态规划

定义状态 a 表示以当前元素作为正结尾的最大交替子数组和,状态 b 表示以当前元素作为负结尾的最大交替子数组和。初始时 a = n u m s [ 0 ] ,$b = -\infty$。

遍历数组,对于当前元素 n u m s [ i ] ,有

a = max ( n u m s [ i ] , b + n u m s [ i ] ) b = a n u m s [ i ]

求出 a b 后,将 a b 中的最大值与当前最大交替子数组和进行比较,更新最大交替子数组和。

时间复杂度 O ( n ) ,空间复杂度 O ( 1 ) 。其中 n 为数组长度。

Python3

class Solution:
    def maximumAlternatingSubarraySum(self, nums: List[int]) -> int:
        ans = nums[0]
        a, b = nums[0], -inf
        for v in nums[1:]:
            a, b = max(v, b + v), a - v
            ans = max(ans, a, b)
        return ans

Java

class Solution {
    public long maximumAlternatingSubarraySum(int[] nums) {
        long ans = nums[0];
        long a = nums[0], b = -(1 << 30);
        for (int i = 1; i < nums.length; ++i) {
            long c = a, d = b;
            a = Math.max(nums[i], d + nums[i]);
            b = c - nums[i];
            ans = Math.max(ans, Math.max(a, b));
        }
        return ans;
    }
}

C++

using ll = long long;

class Solution {
public:
    long long maximumAlternatingSubarraySum(vector<int>& nums) {
        ll ans = nums[0];
        ll a = nums[0], b = -(1 << 30);
        for (int i = 1; i < nums.size(); ++i) {
            ll c = a, d = b;
            a = max(1ll * nums[i], d + nums[i]);
            b = c - nums[i];
            ans = max(ans, max(a, b));
        }
        return ans;
    }
};

Go

func maximumAlternatingSubarraySum(nums []int) int64 {
	ans := nums[0]
	a, b := nums[0], -(1 << 30)
	for _, v := range nums[1:] {
		c, d := a, b
		a = max(v, d+v)
		b = c - v
		ans = max(ans, max(a, b))
	}
	return int64(ans)
}

func max(a, b int) int {
	if a > b {
		return a
	}
	return b
}

...