连续区间最大和问题指的是在给定的一串序列中找出和最大的连续区间。解决这类问题有下面五种方法:
1. o(n^3) 暴力枚举
这种方法就不需要多说了,最简单的方法,但复杂度很高,数据量大时不可取。
2. o(n^2) 预处理+枚举
这种方法无非是在上一种方法的基础上做些优化。sum[i]表示从1-i 这段区间的和,在输入的时候就可以进行预处理,枚举每一段区间 i-j 其和为 sum[j]-sum[i-1]。虽然加了预处理优化,但面对大数据量时人仍无能为力。
3. o(nlogn) 分治
其大致思想是,若对于一段区间[L,R),其中mid=(L+R)>>1,将区间分成左右两边[L,mid),[mid,R),对于两边区间,我们可以递归求解,而对于横跨左右两段区间的区间,我们再特殊处理。
核心代码:
4. o(n) DP
经典的dp问题,状态转移方程:dp[i]=max{dp[i-1]+num[i],num[i]}
5. o(n) xx
先像方法4那样预处理,然后线性扫描,每次维护一个连续区段的最小值min(sum[1]-sum[i-1]),然后更新连续区间最大和ans=max(ans,sum[i]-min)。
核心代码: