题目:来自脑客爱刷题
给定一个数组arr,该数组无序且每个元素均为正数;在给定一个正数K,求arr所有子数组中所有元素相加和为K的最长子数组长度。
例如:
arr:1,2,1,1,1
K:3
结果返回3
解法要求:时间复杂度O(N),额外空间复杂度O(1)
int getSumKMaxSubArrayLen(int* num, int length, int k)
{
if (num == nullptr || length <= 0 || k <= 0)
return -1;
int len = -1, sum = num[0], left = 0, right = 0;
while (right < length)//left可能在right的右边一位,但不影响本题结果
{
if (sum == k)
{
if (right - left + 1>len)
len = right - left + 1;
sum -= num[left];
left++;
}
else if (sum < k)
{
right++;
if (right >= length)//检查是否越界
break;
sum += num[right];
}
else
{
sum -= num[left];
left++;
}
}
return len;
}