LeetCode Problem Workspace

Maximum Sum of 3 Non-Overlapping Subarrays

Maximize the sum of three non-overlapping subarrays with length k in an integer array using dynamic programming.

category

4

Topics

code_blocks

5

Code langs

hub

3

Related

Practice Focus

Hard · State transition dynamic programming

bolt

Answer-first summary

Maximize the sum of three non-overlapping subarrays with length k in an integer array using dynamic programming.

Interview AiBox logo

Ace coding interviews with Interview AiBox guidance for State transition dynamic programming

Try AiBox Copilotarrow_forward

This problem requires identifying three non-overlapping subarrays of length k within an integer array to maximize their sum. The solution involves dynamic programming and sliding window techniques to efficiently calculate the sums and track the lexicographically smallest result.

Problem Statement

You are given an integer array nums and an integer k. Your task is to find three non-overlapping subarrays of length k that have the maximum possible sum. You should return a list of indices representing the starting positions of each subarray. If there are multiple answers, return the lexicographically smallest one.

For example, given nums = [1,2,1,2,6,7,5,1] and k = 2, the correct output is [0,3,5] as the subarrays [1, 2], [2, 6], and [7, 5] have the maximum sum. If there are multiple ways to achieve the same sum, you should return the answer with the lexicographically smallest starting indices.

Examples

Example 1

Input: nums = [1,2,1,2,6,7,5,1], k = 2

Output: [0,3,5]

Subarrays [1, 2], [2, 6], [7, 5] correspond to the starting indices [0, 3, 5]. We could have also taken [2, 1], but an answer of [1, 3, 5] would be lexicographically larger.

Example 2

Input: nums = [1,2,1,2,1,2,1,2,1], k = 2

Output: [0,2,4]

Example details omitted.

Constraints

  • 1 <= nums.length <= 2 * 104
  • 1 <= nums[i] < 216
  • 1 <= k <= floor(nums.length / 3)

Solution Approach

Sliding Window for Subarray Sums

Use a sliding window of size k to calculate the sum of all subarrays of length k in the array. Maintain an array of these sums, which will be used to track the optimal subarrays.

Dynamic Programming for Tracking Best Subarrays

Dynamic programming is used to maintain the best possible subarray sums by calculating the maximum sum subarrays for the first, middle, and last sections of the array. Store the best indices for each segment.

Lexicographical Order Consideration

When multiple subarrays have the same sum, the lexicographically smallest indices must be chosen. This is achieved by comparing the starting indices of subarrays while updating the best result.

Complexity Analysis

Metric Value
Time O(n + k)
Space O(1)

The time complexity of the solution is O(n + k), where n is the length of the array and k is the subarray length. The space complexity is O(1) as we only maintain necessary variables and arrays for tracking results.

What Interviewers Usually Probe

  • Candidate can identify and use sliding window and dynamic programming efficiently.
  • Candidate understands the importance of lexicographical order in handling multiple solutions.
  • Candidate can optimize space usage while calculating results for large input sizes.

Common Pitfalls or Variants

Common pitfalls

  • Failing to properly handle overlapping subarrays, leading to incorrect subarray selections.
  • Not considering the lexicographically smallest answer when multiple solutions have the same sum.
  • Overcomplicating the problem with unnecessary space usage or inefficient algorithms.

Follow-up variants

  • Allowing more than three subarrays to be selected, testing the flexibility of the approach.
  • Changing the value of k to test how the approach scales with different subarray sizes.
  • Introducing constraints on the array values to test the robustness of the algorithm.

FAQ

What is the main technique used to solve the Maximum Sum of 3 Non-Overlapping Subarrays problem?

The solution relies on dynamic programming combined with sliding window and prefix sum techniques to calculate subarray sums and track the optimal results.

How does lexicographical order impact the solution?

When there are multiple subarrays with the same sum, the lexicographically smallest starting indices are selected as the final answer.

What is the time complexity of this problem?

The time complexity of the solution is O(n + k), where n is the length of the array and k is the subarray length.

How does the sliding window technique apply to this problem?

The sliding window technique helps efficiently compute the sum of all subarrays of length k by maintaining a running sum as the window slides across the array.

What are common mistakes to avoid when solving this problem?

Common mistakes include failing to handle overlapping subarrays properly, not considering lexicographical order for multiple solutions, and inefficient space usage.

terminal

Solution

Solution 1: Sliding Window

We use a sliding window to enumerate the position of the third subarray, while maintaining the maximum sum and its position of the first two non-overlapping subarrays.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class Solution:
    def maxSumOfThreeSubarrays(self, nums: List[int], k: int) -> List[int]:
        s = s1 = s2 = s3 = 0
        mx1 = mx12 = 0
        idx1, idx12 = 0, ()
        ans = []
        for i in range(k * 2, len(nums)):
            s1 += nums[i - k * 2]
            s2 += nums[i - k]
            s3 += nums[i]
            if i >= k * 3 - 1:
                if s1 > mx1:
                    mx1 = s1
                    idx1 = i - k * 3 + 1
                if mx1 + s2 > mx12:
                    mx12 = mx1 + s2
                    idx12 = (idx1, i - k * 2 + 1)
                if mx12 + s3 > s:
                    s = mx12 + s3
                    ans = [*idx12, i - k + 1]
                s1 -= nums[i - k * 3 + 1]
                s2 -= nums[i - k * 2 + 1]
                s3 -= nums[i - k + 1]
        return ans

Solution 2: Preprocessing Prefix and Suffix + Enumerating Middle Subarray

We can preprocess to get the prefix sum array $s$ of the array $nums$, where $s[i] = \sum_{j=0}^{i-1} nums[j]$. Then for any $i$, $j$, $s[j] - s[i]$ is the sum of the subarray $[i, j)$.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class Solution:
    def maxSumOfThreeSubarrays(self, nums: List[int], k: int) -> List[int]:
        s = s1 = s2 = s3 = 0
        mx1 = mx12 = 0
        idx1, idx12 = 0, ()
        ans = []
        for i in range(k * 2, len(nums)):
            s1 += nums[i - k * 2]
            s2 += nums[i - k]
            s3 += nums[i]
            if i >= k * 3 - 1:
                if s1 > mx1:
                    mx1 = s1
                    idx1 = i - k * 3 + 1
                if mx1 + s2 > mx12:
                    mx12 = mx1 + s2
                    idx12 = (idx1, i - k * 2 + 1)
                if mx12 + s3 > s:
                    s = mx12 + s3
                    ans = [*idx12, i - k + 1]
                s1 -= nums[i - k * 3 + 1]
                s2 -= nums[i - k * 2 + 1]
                s3 -= nums[i - k + 1]
        return ans
Maximum Sum of 3 Non-Overlapping Subarrays Solution: State transition dynamic programming | LeetCode #689 Hard