Given an array arr[] containing integers and an integer k, your task is to find the length of the longest subarray where the sum of its elements is equal to the given value k. If there is no subarray with sum equal to k, return 0.
Examples:
Input: arr[] = [10, 5, 2, 7, 1, -10], k = 15 Output: 6 Explanation: Subarrays with sum = 15 are [5, 2, 7, 1], [10, 5] and [10, 5, 2, 7, 1, -10]. The length of the longest subarray with a sum of 15 is 6.
Input: arr[] = [-5, 8, -14, 2, 4, 12], k = -5 Output: 5 Explanation: Only subarray with sum = 15 is [-5, 8, -14, 2, 4] of length 5.
Input: arr[] = [10, -10, 20, 30], k = 5 Output: 0 Explanation: No subarray with sum = 5 is present in arr[].
Constraints:
1 ≤ arr.size() ≤ 105
-104 ≤ arr[i] ≤ 104
-109 ≤ k ≤ 109
Approach 01:
-
C++
-
Python
class Solution {
public:
int longestSubarray(vector<int>& nums, int targetSum) {
int size = nums.size();
int currentPrefixSum = 0;
unordered_map<int, int> prefixIndexMap = {{0, -1}};
int maxLength = 0;
// Traverse the array and calculate the prefix sum
for (int i = 0; i < size; ++i) {
currentPrefixSum += nums[i];
int requiredSum = currentPrefixSum - targetSum;
// Check if the required prefix sum exists
if (prefixIndexMap.find(requiredSum) != prefixIndexMap.end()) {
maxLength = max(maxLength, i - prefixIndexMap[requiredSum]);
}
// Store the current prefix sum in the map if not already present
if (prefixIndexMap.find(currentPrefixSum) == prefixIndexMap.end()) {
prefixIndexMap[currentPrefixSum] = i;
}
}
return maxLength;
}
};
class Solution:
def longestSubarray(self, nums, targetSum):
size = len(nums)
currentPrefixSum = 0
prefixIndexMap = {0: -1}
maxLength = 0
# Traverse the array and calculate the prefix sum
for i in range(size):
currentPrefixSum += nums[i]
requiredSum = currentPrefixSum - targetSum
# Check if the required prefix sum exists
if requiredSum in prefixIndexMap:
maxLength = max(maxLength, i - prefixIndexMap[requiredSum])
# Store the current prefix sum in the map if not already present
if currentPrefixSum not in prefixIndexMap:
prefixIndexMap[currentPrefixSum] = i
return maxLength
Time Complexity:
- Array Traversal:
We traverse the array once, which takes \( O(n) \), where \( n \) is the size of the array.
- Prefix Sum Map Operations:
For each element in the array, we perform \( O(1) \) operations for insertion and lookup in the hash map. This adds up to \( O(n) \) for all elements.
- Overall Time Complexity:
The total time complexity is \( O(n) \).
Space Complexity:
- Hash Map:
The hash map stores at most \( n + 1 \) entries (one for each prefix sum plus the initial zero sum). This takes \( O(n) \) space.
- Overall Space Complexity:
The total space complexity is \( O(n) \).