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
Your algorithm should run in O(n^2) time and use O(1) extra space.
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.
nums
: An array of positive integers.S
: A positive integer representing the maximum allowed sum of the subarray.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.
The core challenge is to find the longest contiguous subarray whose sum does not exceed a given value S. This problem is significant in scenarios where resource constraints are critical, such as memory usage in computing or budget constraints in financial planning.
Potential pitfalls include misunderstanding the requirement for the subarray to be contiguous and not considering all possible subarrays.
To solve this problem, we can use a sliding window approach. The idea is to maintain a window that expands and contracts to find the longest subarray with a sum at most S.
A naive solution would involve checking all possible subarrays and calculating their sums, which would result in a time complexity of O(n^3). This is not optimal.
We can improve the solution by using a sliding window technique:
start
and end
, both set to the beginning of the array.end
pointer to include more elements in the window and keep track of the sum of the current window.start
pointer to reduce the window size until the sum is at most S.Here is a step-by-step breakdown of the sliding window algorithm:
start
and end
to 0, currentSum
to 0, and maxLength
to 0.end
pointer.currentSum
.currentSum
exceeds S, increment the start
pointer and subtract the element at start
from currentSum
.maxLength
, update maxLength
and store the current start and end indices./**
* Function to find the longest subarray with sum at most S
* @param {number[]} nums - Array of positive integers
* @param {number} S - Maximum allowed sum of the subarray
* @return {number[]} - Start and end indices of the longest subarray
*/
function longestSubarrayWithSumAtMostS(nums, S) {
let start = 0;
let currentSum = 0;
let maxLength = 0;
let result = [-1, -1];
for (let end = 0; end < nums.length; end++) {
// Add the current element to the current sum
currentSum += nums[end];
// While the current sum exceeds S, move the start pointer to the right
while (currentSum > S) {
currentSum -= nums[start];
start++;
}
// Update the maximum length and result indices if a longer subarray is found
if (end - start + 1 > maxLength) {
maxLength = end - start + 1;
result = [start, end];
}
}
return result;
}
// Example usage:
const nums = [3, 2, 5, 2, 2, 1, 1, 3, 1, 2];
const S = 11;
console.log(longestSubarrayWithSumAtMostS(nums, S)); // Output: [3, 8]
The time complexity of the sliding window approach is O(n) because each element is processed at most twice (once when added and once when subtracted). The space complexity is O(1) as we are using a constant amount of extra space.
Consider the following edge cases:
Input: nums = [12, 15, 20], S = 10 Output: [-1, -1] Input: nums = [], S = 10 Output: [-1, -1] Input: nums = [1, 2, 3, 4, 5], S = 100 Output: [0, 4]
To test the solution comprehensively, consider the following test cases:
console.log(longestSubarrayWithSumAtMostS([3, 2, 5, 2, 2, 1, 1, 3, 1, 2], 11)); // [3, 8] console.log(longestSubarrayWithSumAtMostS([12, 15, 20], 10)); // [-1, -1] console.log(longestSubarrayWithSumAtMostS([], 10)); // [-1, -1] console.log(longestSubarrayWithSumAtMostS([1, 2, 3, 4, 5], 100)); // [0, 4]
When approaching such problems, consider the following tips:
In this blog post, we discussed how to find the longest 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 improving problem-solving skills and preparing for coding interviews.
For further reading and practice, consider the following resources: