列表

详情


1749. 任意子数组和的绝对值的最大值

给你一个整数数组 nums 。一个子数组 [numsl, numsl+1, ..., numsr-1, numsr] 的 和的绝对值 为 abs(numsl + numsl+1 + ... + numsr-1 + numsr) 。

请你找出 nums 中 和的绝对值 最大的任意子数组(可能为空),并返回该 最大值 。

abs(x) 定义如下:

 

示例 1:

输入:nums = [1,-3,2,3,-4]
输出:5
解释:子数组 [2,3] 和的绝对值最大,为 abs(2+3) = abs(5) = 5 。

示例 2:

输入:nums = [2,-5,1,-4,3,-2]
输出:8
解释:子数组 [-5,1,-4] 和的绝对值最大,为 abs(-5+1-4) = abs(-8) = 8 。

 

提示:

原站题解

去查看

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

python3 解法, 执行用时: 120 ms, 内存消耗: 24.7 MB, 提交时间: 2022-12-12 14:42:48

'''
思路:dp
'''
class Solution:
    def maxAbsoluteSum(self, nums: List[int]) -> int:
        up, down, ans = 0, 0, 0
        for v in nums:
            up = up + v if up > 0 else v
            down = down + v if down < 0 else v
            ans = max(ans, abs(up), abs(down))
        return ans

python3 解法, 执行用时: 120 ms, 内存消耗: 26.5 MB, 提交时间: 2022-12-12 14:41:36

'''
思路:前缀和
'''
class Solution:
    def maxAbsoluteSum(self, nums: List[int]) -> int:
        n = len(nums)
        presum = [0 for _ in range(n + 1)]      #前缀和
        for i in range(1, n+1):
            presum[i] = presum[i-1] + nums[i-1]
        presum.sort()                           #排序
        return presum[n] - presum[0]            #最大和最小的差距

python3 解法, 执行用时: 140 ms, 内存消耗: 25.4 MB, 提交时间: 2022-12-12 14:40:21

'''
思路:前缀和
计算前缀和数组,寻找最大前缀和、最小前缀和
如果最大前缀和、最小前缀和都是正数(或0),那么最大子数组和绝对值为最大前缀和
如果最大前缀和、最小前缀和都是负数(或0),那么最大子数组和绝对值为最小前缀和的绝对值
如果一个正数一个负数,那么最大子数组和绝对值为最大前缀和-最小前缀和
'''
class Solution:
    def maxAbsoluteSum(self, nums: List[int]) -> int:
        maxpre, minpre = -inf, inf
        for pre in accumulate(nums):
            maxpre = max(pre, maxpre)
            minpre = min(pre, minpre)
        if minpre >= 0:
            return maxpre
        if maxpre <= 0:
            return abs(minpre)
        return maxpre - minpre

golang 解法, 执行用时: 48 ms, 内存消耗: 8.3 MB, 提交时间: 2023-08-08 07:42:49

func maxAbsoluteSum(nums []int) int {
    kadane := func(arr []int) int {
        maxEndingHere, maxSoFar := arr[0], arr[0]
        for _, num := range arr[1:] {
            maxEndingHere = max(num, maxEndingHere+num)
            maxSoFar = max(maxSoFar, maxEndingHere)
        }
        return maxSoFar
    }

    maxSum := kadane(nums)
    minSum := kadane(negate(nums))

    return max(maxSum, minSum)
}

func negate(nums []int) []int {
    result := make([]int, len(nums))
    for i, num := range nums {
        result[i] = -num
    }
    return result
}

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

python3 解法, 执行用时: 164 ms, 内存消耗: 28.4 MB, 提交时间: 2023-08-08 07:42:08

class Solution:
    def maxAbsoluteSum(self, nums: List[int]) -> int:
        def kadane(arr):
            max_ending_here = max_so_far = arr[0]
            for num in arr[1:]:
                max_ending_here = max(num, max_ending_here + num)
                max_so_far = max(max_so_far, max_ending_here)
            return max_so_far
        
        max_sum = kadane(nums)
        min_sum = kadane([-num for num in nums])
        
        return max(max_sum, min_sum)

上一题