int usingTwoPointersApproach(vector<int> &a, long long k)
{
int i = 0, j = 0;
long long int maxLength = 0, sum = 0;
while(j < a.size())
{
sum += a[j];
while(sum > k)
{
sum -= a[i];
i++;
}
if(sum == k)
{
if(maxLength < j-i+1)
maxLength = j-i+1;
}
j++;
}
return maxLength;
}
int usingHashMap(vector<int> &a, long long k)
{
unordered_map<int, int> mp;
int i = 0, size = a.size();
long long int prefixSum = 0, maxLength = 0;
while(i < size)
{
prefixSum += a[i];
if(mp.find(prefixSum-k) != mp.end())
{
int length = i-mp[prefixSum-k];
if(maxLength < i-mp[prefixSum-k])
maxLength = i-mp[prefixSum-k];
}
// TO handle zeroes, we insert that condition.
if(mp.find(prefixSum) == mp.end())
mp[prefixSum] = i;
i++;
}
return maxLength;
}
int longestSubarrayWithSumK(vector<int> a, long long k) {
return usingTwoPointersApproach(a, k);
// return usingHashMap(a, k);
}