Start learning free

LESSON 233 OF 410 · PARTIAL SUMS #1

Longest Subarray with Sum at most S in O(n^2) Time Complexity using Java

Practice O(n2) Read the full explanation

Given an array of positive integers and a number S, find the longest contiguous subarray having the sum at most S.

Return the start and end indices denoting this subarray.

Example

Input: nums = [3, 2, 5, 2, 2, 1, 1, 3, 1 , 2], S = 11
Output: [3, 8]
Explanation:the subarray nums[3...8] of sum 10

Note:

Your algorithm should run in O(n^2) time and use O(1) extra space.


STEP 1 OF 10
    Ctrl + Enter to check

    JAVA · PARTIAL SUMS #1

    Longest Subarray With Sum At Most S in Java, explained

    Problem Definition

    The problem requires finding the longest contiguous subarray within a given array of positive integers such that the sum of the subarray is at most a given number S. The output should be the start and end indices of this subarray.

    Input

    • An array of positive integers, nums.
    • A positive integer, S.

    Output

    • An array containing two integers representing the start and end indices of the longest subarray with sum at most S.

    Constraints and Assumptions

    • All elements in the array are positive integers.
    • The array can have a length of up to 10^5.
    • The sum S is a positive integer.

    Example

    Input: nums = [3, 2, 5, 2, 2, 1, 1, 3, 1, 2], S = 11
    Output: [3, 8]
    Explanation: The subarray nums[3...8] has a sum of 10, which is the longest subarray with sum at most 11.

    Understanding the Problem

    The core challenge is to find the longest contiguous subarray whose sum does not exceed a given value S. This problem is significant in various applications such as resource allocation, budgeting, and data analysis where constraints must be respected.

    Potential pitfalls include misunderstanding the requirement for the subarray to be contiguous and not considering all possible subarrays.

    Approach

    To solve this problem, we can use a sliding window approach to maintain a window of elements that have a sum less than or equal to S. This approach ensures that we efficiently find the longest subarray without having to check all possible subarrays explicitly.

    Naive Solution

    A naive solution would involve checking all possible subarrays and calculating their sums. This would have a time complexity of O(n^3) and is not optimal for large arrays.

    Optimized Solution

    We can optimize the solution using a sliding window approach:

    • Initialize two pointers, start and end, both set to the beginning of the array.
    • Maintain a variable currentSum to store the sum of the current window.
    • Expand the window by moving the end pointer and adding the element at end to currentSum.
    • If currentSum exceeds S, move the start pointer to the right until currentSum is less than or equal to S.
    • Keep track of the maximum length of the window that satisfies the condition and update the start and end indices accordingly.

    Algorithm

    Here is a step-by-step breakdown of the sliding window algorithm:

    1. Initialize start and end to 0, currentSum to 0, and variables to store the maximum length and corresponding indices.
    2. Iterate through the array using the end pointer.
    3. Add the element at end to currentSum.
    4. While currentSum exceeds S, increment the start pointer and subtract the element at start from currentSum.
    5. Update the maximum length and indices if the current window length is greater than the previously recorded maximum length.
    6. Return the start and end indices of the longest subarray.

    Code Implementation

    public class LongestSubarrayWithSumAtMostS {
        public static int[] findLongestSubarray(int[] nums, int S) {
            int start = 0, end = 0, currentSum = 0;
            int maxLength = 0;
            int[] result = new int[2];
    
            while (end < nums.length) {
                // Add the current element to the currentSum
                currentSum += nums[end];
    
                // While currentSum exceeds S, move the start pointer to the right
                while (currentSum > S && start <= end) {
                    currentSum -= nums[start];
                    start++;
                }
    
                // Update the maximum length and result indices if needed
                if (end - start + 1 > maxLength) {
                    maxLength = end - start + 1;
                    result[0] = start;
                    result[1] = end;
                }
    
                // Move the end pointer to the right
                end++;
            }
    
            return result;
        }
    
        public static void main(String[] args) {
            int[] nums = {3, 2, 5, 2, 2, 1, 1, 3, 1, 2};
            int S = 11;
            int[] result = findLongestSubarray(nums, S);
            System.out.println("Start index: " + result[0] + ", End index: " + result[1]);
        }
    }
    

    Complexity Analysis

    The time complexity of the sliding window approach is O(n) because each element is processed at most twice (once by the end pointer and once by the start pointer). The space complexity is O(1) as we are using a constant amount of extra space.

    Edge Cases

    Potential edge cases include:

    • An empty array: The function should return an empty result or a specific value indicating no subarray found.
    • All elements greater than S: The function should handle this gracefully and return an appropriate result.
    • Array with a single element: The function should correctly identify if the single element is less than or equal to S.

    Testing

    To test the solution comprehensively, consider the following test cases:

    • Simple cases with small arrays.
    • Cases where the entire array is the longest subarray.
    • Cases with multiple subarrays having the same length but different sums.
    • Edge cases as mentioned above.

    Thinking and Problem-Solving Tips

    When approaching such problems, consider the following tips:

    • Understand the problem requirements and constraints thoroughly.
    • Think about different approaches and their time and space complexities.
    • Use diagrams or pseudo-code to visualize the problem and solution.
    • Practice similar problems to improve problem-solving skills.

    Conclusion

    In this blog post, we discussed how to find the longest contiguous subarray with a sum at most S using a sliding window approach. We covered the problem definition, approach, algorithm, code implementation, complexity analysis, edge cases, and testing. Understanding and solving such problems is crucial for developing strong problem-solving skills in programming.

    Additional Resources

    For further reading and practice, consider the following resources:

    • LeetCode - A platform for practicing coding problems.
    • GeeksforGeeks - A website with tutorials and problems on various algorithms and data structures.
    • Coursera - Online courses on algorithms and data structures.
    Keep going with JavaAbout 340 step-by-step lessons, from your first line of code to coding interviews. Free to start.
    Start learning free