题目

类型:Array
image.png

解题思路

要计算三个无重叠子数组的最大和,可以枚举第三个子数组的位置,同时维护前两个无重叠子数组的最大和及其位置。
要计算两个无重叠子数组的最大和,可以枚举第二个子数组的位置,同时维护第一个子数组的最大和及其位置。
因此,首先解决单个子数组的最大和问题,然后解决两个无重叠子数组的最大和问题,最后解决三个无重叠子数组的最大和问题。

代码

  1. class Solution {
  2. public int[] maxSumOfThreeSubarrays(int[] nums, int k) {
  3. int[] ans = new int[3];
  4. int sum1 = 0, maxSum1 = 0, maxSum1Idx = 0;
  5. int sum2 = 0, maxSum12 = 0, maxSum12Idx1 = 0, maxSum12Idx2 = 0;
  6. int sum3 = 0, maxTotal = 0;
  7. for (int i = k * 2; i < nums.length; ++i) {
  8. sum1 += nums[i - k * 2];
  9. sum2 += nums[i - k];
  10. sum3 += nums[i];
  11. if (i >= k * 3 - 1) {
  12. if (sum1 > maxSum1) {
  13. maxSum1 = sum1;
  14. maxSum1Idx = i - k * 3 + 1;
  15. }
  16. if (maxSum1 + sum2 > maxSum12) {
  17. maxSum12 = maxSum1 + sum2;
  18. maxSum12Idx1 = maxSum1Idx;
  19. maxSum12Idx2 = i - k * 2 + 1;
  20. }
  21. if (maxSum12 + sum3 > maxTotal) {
  22. maxTotal = maxSum12 + sum3;
  23. ans[0] = maxSum12Idx1;
  24. ans[1] = maxSum12Idx2;
  25. ans[2] = i - k + 1;
  26. }
  27. sum1 -= nums[i - k * 3 + 1];
  28. sum2 -= nums[i - k * 2 + 1];
  29. sum3 -= nums[i - k + 1];
  30. }
  31. }
  32. return ans;
  33. }
  34. }