【LeetCode 算法】Maximum Absolute Sum of Any Subarray 任意子数组和的绝对值的最大值-动态规划

文章目录

  • Maximum Absolute Sum of Any Subarray 任意子数组和的绝对值的最大值
    • 问题描述:
    • 分析
    • 代码
      • 动态规划
    • Tag

Maximum Absolute Sum of Any Subarray 任意子数组和的绝对值的最大值

问题描述:

给你一个整数数组 nums 。一个子数组 [ n u m s l , n u m s l + 1 , . . . , n u m s r − 1 , n u m s r ] [nums_l, nums_{l+1}, ..., nums_{r-1}, nums_{r}] [numsl,numsl+1,...,numsr1,numsr] 的 和的绝对值 为 a b s ( n u m s l + n u m s l + 1 + . . . + n u m s r − 1 + n u m s r ) abs(nums_l + nums_{l+1} + ... + nums_{r-1} + nums_{r}) abs(numsl+numsl+1+...+numsr1+numsr)

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

abs(x) 定义如下:

如果 x 是负整数,那么 a b s ( x ) = − x abs(x) = -x abs(x)=x
如果 x 是非负整数,那么 a b s ( x ) = x abs(x) = x abs(x)=x

1 < = n u m s . l e n g t h < = 1 0 5 − 1 0 4 < = n u m s [ i ] < = 1 0 4 1 <= nums.length <= 10^5\\ -10^4 <= nums[i] <= 10^4 1<=nums.length<=105104<=nums[i]<=104

分析

除了暴力枚举,前缀和计算。

还有一个专门用来处理子数组最大和的算法Kadane's Algorithm。它可以在线性的时间复杂度下,计算出子数组的最大和。具体的理论可以google,bing。

代码

动态规划

public int maxAbsoluteSum(int[] nums) {
        int ans = 0, fMax = 0, fMin = 0;
        for (int x : nums) {
            fMax = Math.max(fMax, 0) + x;
            fMin = Math.min(fMin, 0) + x;
            ans = Math.max(ans, Math.max(fMax, -fMin));
        }
        return ans;
    }
 

时间复杂度 O ( N ) O(N) O(N)

空间复杂度 O ( 1 ) O(1) O(1)

Tag

Array

Dynamic Programming

你可能感兴趣的:(数据结构与算法,算法,leetcode,动态规划)