45. 最大子数组差

45. 最大子数组差

中文English

给定一个整数数组,找出两个不重叠的子数组A和B,使两个子数组和的差的绝对值|SUM(A) - SUM(B)|最大。

返回这个最大的差值。

样例

例1:

输入:[1, 2, -3, 1]
输出:6
解释:
子数组是 [1,2] 和[-3].所以答案是 6.

例2:

输入:[0,-1]
输出:1
解释:
子数组是 [0] 和 [-1].所以答案是 1.

挑战

时间复杂度为O(n),空间复杂度为O(n)

注意事项

子数组最少包含一个数

贪心解法 + 维护四个列表(左大右小, 右大左小)

class Solution:
    """
    @param nums: A list of integers
    @return: An integer indicate the value of maximum difference between two substrings
    """
    def maxDiffSubArrays(self, nums):
        # 边界检测
        if len(nums) < 2:
            return 0

        # 变量定义
        length = len(nums)
        max_sum_array_left, max_sum_array_right = [0]*length, [0]*length
        min_sum_array_left, min_sum_array_right = [0]*length, [0]*length
        
        # 贪心计算
        for i in range(length):
            if i == 0: 
                max_sum_array_left[0] = nums[0]
                min_sum_array_left[0] = nums[0]
            else:
                max_sum_array_left[i] = max(nums[i], nums[i] + max_sum_array_left[i - 1])
                min_sum_array_left[i] = min(nums[i], nums[i] + min_sum_array_left[i - 1])

        
        for i in range(length - 1, -1, -1):
            if  i == length - 1: 
                max_sum_array_right[length - 1]: max_sum_array_right[length - 1] = nums[length - 1]
                min_sum_array_right[length - 1]: min_sum_array_right[length - 1] = nums[length - 1]
            else:
                max_sum_array_right[i] = max(nums[i], nums[i] + max_sum_array_right[i + 1])
                min_sum_array_right[i] = min(nums[i], nums[i] + min_sum_array_right[i + 1])
        
        # 最后计算
        res = -sys.maxsize
        for i in range(length - 1):
            res = max(res, abs(max_sum_array_left[i] - min_sum_array_right[i + 1]), abs(min_sum_array_left[i] - max_sum_array_right[i + 1]))
        
        return res

 

posted @ 2021-01-25 21:21  风不再来  阅读(86)  评论(0编辑  收藏  举报