classSolution: defmaximumSum(self, arr: List[int]) -> int: res = arr[0] defmaxSubSum(arr, skip): res = maxSub = float("-inf")
for i in range(len(arr)): if i == skip: continue maxSub = max(arr[i], maxSub + arr[i]) res = max(res, maxSub) return res # 这里循环到了len(arr)项,表示的是一个都不删除的情况 for i in range(len(arr) + 1): res = max(res, maxSubSum(arr, i)) return res
一层遍历, 建立 l 数组,l[i]表示从左边开始的以 arr[i]结尾的 subArraySum 的最大值
一层遍历, 建立 r 数组,r[i]表示从右边开始的以 arr[i]结尾的 subArraySum 的最大值
一层遍历, 计算 l[i - 1] + r[i + 1] 的最大值
l[i - 1] + r[i + 1]的含义就是删除 arr[i]的子数组最大值
上面的这个步骤得到了删除一个的子数组最大值, 不删除的只需要在上面循环顺便计算一下即可
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
classSolution: defmaximumSum(self, arr: List[int]) -> int: n = len(arr) l = [arr[0]] * n r = [arr[n - 1]] * n if n == 1: return arr[0] res = arr[0] for i in range(1, n): l[i] = max(l[i - 1] + arr[i], arr[i]) res = max(res, l[i]) for i in range(n - 2, -1, -1): r[i] = max(r[i + 1] + arr[i], arr[i]) res = max(res, r[i]) for i in range(1, n - 1): res = max(res, l[i - 1] + r[i + 1])