1+ /**
2+ * 689. Maximum Sum of 3 Non-Overlapping Subarrays
3+ * https://leetcode.com/problems/maximum-sum-of-3-non-overlapping-subarrays/
4+ **/
5+ 6+ class Solution {
7+ func maxSumOfThreeSubarrays( _ nums: [ Int ] , _ k: Int ) -> [ Int ] {
8+ var dp : [ ( sum: Int , ind: Int ) ] = [ ]
9+ 10+ var l = 0 , r = - 1 , sum = 0
11+ while r < nums. count- 1 {
12+ r += 1
13+ sum += nums [ r]
14+ if r - l + 1 > k {
15+ sum -= nums [ l]
16+ l += 1
17+ }
18+ if r - l + 1 == k {
19+ dp. append ( ( sum: sum, ind: l) )
20+ }
21+ }
22+ 23+ var best_dp = [ ( left: Int? , right: Int? ) ] ( repeating: ( nil , nil ) , count: dp. count)
24+ 25+ var best = 0
26+ for i in 0 ... dp. count- 1 {
27+ best_dp [ i] . left = dp [ i] . sum > dp [ best] . sum ? i : best
28+ best = best_dp [ i] . left!
29+ }
30+ 31+ best = dp. count - 1
32+ for i in ( 0 ... dp. count- 1 ) . reversed ( ) {
33+ best_dp [ i] . right = dp [ i] . sum >= dp [ best] . sum ? i : best
34+ best = best_dp [ i] . right!
35+ }
36+ 37+ var ans : [ Int ] = [ ] , ans_sum = 0
38+ 39+ for i in k ... best_dp. count- k- 1 {
40+ let s = dp [ i] . sum + dp[ best_dp [ i- k] . left!] . sum + dp[ best_dp [ i+ k] . right!] . sum
41+ if s > ans_sum {
42+ ans_sum = s
43+ ans = [ best_dp [ i- k] . left!, i, best_dp [ i+ k] . right!]
44+ }
45+ }
46+ 47+ return ans
48+ }
49+ }
0 commit comments