Advertisement
1988coder

Maximum Sum of 3 Non-Overlapping Subarrays

Sep 28th, 2018
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 1.88 KB | None | 0 0
  1. /*
  2. Refer to below link for details analysis.
  3. https://leetcode.com/problems/maximum-sum-of-3-non-overlapping-subarrays/discuss/108231/C++Java-DP-with-explanation-O(n)/110501
  4.  
  5. Time Complexity = O(n)
  6.  
  7. Space Complexity = O(n)
  8. */
  9. class Solution {
  10.     public int[] maxSumOfThreeSubarrays(int[] nums, int k) {
  11.         if (nums == null || nums.length < 3 * k) {
  12.             return new int[3];
  13.         }
  14.         if (nums.length == 3 * k) {
  15.             return new int[]{0, k, 2 * k};
  16.         }
  17.        
  18.         int n = nums.length;
  19.         int[] sums = new int[n+1];
  20.         int[] posRight = new int[n];
  21.         int[] posLeft = new int[n];
  22.         int[] result = new int[3];
  23.        
  24.         for (int i = 0; i < n; i++) {
  25.             sums[i+1] = sums[i] + nums[i];
  26.         }
  27.        
  28.         int lastSum = sums[k] - sums[0];
  29.         for (int i = k + 1; i <= n - 2*k; i++) {
  30.             int sum = sums[i] - sums[i-k];
  31.             if (sum > lastSum) {
  32.                 posLeft[i] = i-k;
  33.                 lastSum = sum;
  34.             } else {
  35.                 posLeft[i] = posLeft[i-1];
  36.             }
  37.         }
  38.        
  39.         lastSum = sums[n] - sums[n-k];
  40.         posRight[n - 2*k] = n-k;
  41.         for (int i = n - 2*k - 1; i >= k; i--) {
  42.             int sum = sums[i+2*k] - sums[i+k];
  43.             if (sum >= lastSum) {
  44.                 posRight[i] = i+k;
  45.                 lastSum = sum;
  46.             } else {
  47.                 posRight[i] = posRight[i+1];
  48.             }
  49.         }
  50.        
  51.         int maxSum = 0;
  52.         for (int i = k; i <= n - 2 *k; i++) {
  53.             int l = posLeft[i];
  54.             int r = posRight[i];
  55.             int sum = (sums[l+k] - sums[l]) + (sums[i+k] - sums[i]) + (sums[r+k] - sums[r]);
  56.             if (sum > maxSum) {
  57.                 result = new int[]{l,i,r};
  58.                 maxSum = sum;
  59.             }
  60.         }
  61.        
  62.         return result;
  63.     }
  64. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement