689. Maximum Sum of 3 Non-Overlapping Subarrays
1 class Solution { 2 public int[] maxSumOfThreeSubarrays(int[] nums, int k) { 3 if(nums.length == 0) return new int[0]; 4 int n = nums.length; 5 int[] sum = new int[n+1], posLeft = new int[n], posRight = new int[n]; 6 for(int i = 0; i < n; i++){ 7 sum[i+1] = sum[i] + nums[i]; 8 } 9 for(int i = k, tot = sum[k] - sum[0]; i < n; i++){ //从k开始 , 这一位的sum是sum[i+1] 10 if(sum[i+1] - sum[i-k+1] > tot){ 11 tot = sum[i+1] - sum[i-k+1]; 12 posLeft[i] = i-k+1; 13 }else{ 14 posLeft[i] = posLeft[i-1]; 15 } 16 } 17 18 posRight[n-k] = n-k; 19 for(int i = n-k-1, tot = sum[n] - sum[n-k]; i >= 0; i--){ 20 if(sum[i+k] - sum[i] >= tot){ 21 tot = sum[i+k] - sum[i]; 22 posRight[i] = i; 23 }else{ 24 posRight[i] = posRight[i+1]; 25 } 26 } 27 int[] res = new int[3]; 28 int max = Integer.MIN_VALUE; 29 for(int i = k; i <= n-2*k; i++){ // == k, <= n-2*k 左边的边界可以等于 下一位就是mid的开头了 30 int l = posLeft[i-1], r = posRight[i+k]; 31 int temp = sum[l+k] - sum[l] + sum[i+k] - sum[i] + sum[r+k] - sum[r]; 32 if(max < temp){ 33 max = temp; 34 res[0] = l; 35 res[1] = i; 36 res[2] = r; 37 } 38 } 39 return res; 40 41 } 42 }
https://leetcode.com/problems/maximum-sum-of-3-non-overlapping-subarrays/discuss/108231/C++Java-DP-with-explanation-O(n)