1+ function maxSubArray ( nums : number [ ] ) : number {
2+ if ( nums . length === 0 ) {
3+ return 0 ;
4+ }
5+
6+ if ( nums . length === 1 ) {
7+ return nums [ 0 ] ;
8+ }
9+
10+ const maxI = [ nums [ 0 ] ] ;
11+ nums . forEach ( ( num , i ) => {
12+ if ( ! i ) {
13+ return ;
14+ }
15+
16+ maxI [ i ] = Math . max ( maxI [ i - 1 ] + num , num ) ;
17+ } )
18+
19+ return Math . max ( ...maxI ) ;
20+ } ;
21+
22+ function Status ( lSum : number , rSum : number , mSum : number , iSum : number ) {
23+ return {
24+ lSum,
25+ rSum,
26+ mSum,
27+ iSum,
28+ } ;
29+ }
30+
31+ function getSum ( nums : number [ ] , start : number , end : number ) {
32+ if ( start === end ) {
33+ return Status ( nums [ start ] , nums [ start ] , nums [ start ] , nums [ start ] ) ;
34+ }
35+
36+ const mIndex = Math . floor ( ( start + end ) / 2 ) ;
37+ const leftSum = getSum ( nums , start , mIndex ) ;
38+ const rightSum = getSum ( nums , mIndex + 1 , end ) ;
39+
40+ return Status (
41+ Math . max ( leftSum . lSum , leftSum . iSum + rightSum . lSum ) ,
42+ Math . max ( rightSum . rSum , rightSum . iSum + leftSum . rSum ) ,
43+ Math . max ( leftSum . mSum , rightSum . mSum , leftSum . rSum + rightSum . lSum ) ,
44+ leftSum . iSum + rightSum . iSum
45+ )
46+
47+ }
48+
49+ /**
50+ * 线段树
51+ * @param nums
52+ */
53+ function maxSubArray2 ( nums : number [ ] ) : number {
54+ return getSum ( nums , 0 , nums . length - 1 ) . mSum ;
55+ } ;
0 commit comments