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