[未完成][基础算法 && 进阶数据结构] 最大子段和 && 子段和线段树
最大子段和O(n) dp:
一句话,dp[n] = max(dp[n - 1] + arr[n], dp[n])
最大子段和O(nlogn) 分治:
假设在区间 [left, right]中的最大字段和区间为[i, j],设mid = (left + right) / 2 ,那么一定会是以下三种情况其一:
- left <= i <= mid <= j <=right
- left <= i <= j <= mid
- mid+1 <= i <= j <= right
因此我们只需要求出以上三种情况中最大值即可。
对于1,mid是包括在[i, j]集合中的,只需要分别从 left ← mid 以及 mid → right 分别枚举得到使区间最大值的 i 与 j,再两个相累加
对于2,我们使 right = mid,重新求 mid 进行二分缩减,再分别讨论 1~3 的情况 (base case: left = right)
对于3,同理,我们使 left = mid + 1,重新 mid 进行二分缩减,再分别讨论 1~3 的情况 (base case: left = right)