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)

posted @ 2018-10-23 01:08  jasoncool1  阅读(157)  评论(0编辑  收藏  举报