|
80 | 80 | // @lc code=start
|
81 | 81 | class Solution {
|
82 | 82 | int callme(int[] A, int L, int M){
|
83 | | - int n = A.length, cur = 0; |
84 | | - int[] dp = new int[n]; |
85 | | - for(int i=0; i<n; i++){ |
86 | | - cur += A[i]; |
87 | | - if(i>=L) |
88 | | - cur -= A[i-L]; |
89 | | - else if(i < L-1) |
90 | | - continue; |
91 | | - dp[i] = Math.max( i == 0 ? 0 : dp[i-1], cur); |
92 | | - } |
93 | | - cur = 0; |
94 | | - int maxtillnow = 0, ans = 0; |
95 | | - for(int i=n-1; i>=L; i--){ |
96 | | - cur += A[i]; |
97 | | - if(i+M < n) |
98 | | - cur -= A[i+M]; |
99 | | - else if(i+M > n) |
100 | | - continue; |
101 | | - maxtillnow = Math.max(maxtillnow, cur); |
102 | | - ans = Math.max(ans, dp[i-1]+maxtillnow); |
| 83 | + int msum = 0, lsum = 0, maxlsum = 0, ans = 0; |
| 84 | + for(int i=0; i<A.length; i++){ |
| 85 | + msum += A[i]; |
| 86 | + if(i-M >= 0){ |
| 87 | + msum -= A[i-M]; |
| 88 | + lsum += A[i-M]; |
| 89 | + } |
| 90 | + if(i-M-L>=0) |
| 91 | + lsum -= A[i-M-L]; |
| 92 | + |
| 93 | + if(i-M-L >= -1){ |
| 94 | + maxlsum = Math.max(maxlsum, lsum); |
| 95 | + ans = Math.max(ans, maxlsum+msum); |
| 96 | + } |
103 | 97 | }
|
104 | 98 | return ans;
|
105 | 99 | }
|
| 100 | + |
106 | 101 | public int maxSumTwoNoOverlap(int[] A, int L, int M) {
|
107 | 102 | return Math.max(callme(A, L, M), callme(A, M, L));
|
108 | 103 | }
|
|
0 commit comments