给一个数组nums
和目标值k
,找到数组中最长的子数组,使其中的元素和为k。如果没有,则返回0。
样例
样例1
输入: nums = [1, -1, 5, -2, 3], k = 3
输出: 4
解释:
子数组[1, -1, 5, -2]的和为3,且长度最大
样例2
输入: nums = [-2, -1, 2, 1], k = 1
输出: 2
解释:
子数组[-1, 2]的和为1,且长度最大
挑战
能否用O(n)的时间复杂度完成?
注意事项
数组之和保证在32位有符号整型数的范围内
class Solution {
public:
/**
* @param nums: an array
* @param k: a target value
* @return: the maximum length of a subarray that sums to k
*/
int maxSubArrayLen(vector<int> &nums, int k)
{
// Write your code here
int ret = 0;
int size = nums.size();
//t sum[size+1];
vector<int> sum(size+1);
sum[0] = 0;
for(int i = 1; i <= size; i++)
{
sum[i] = sum[i-1] + nums[i-1];
}
for(int i = 0; i < sum.size(); i++)
{
for(int j = 0; j < i; j++)
{
if(sum[i] - sum[j] == k)
{
ret = max(ret, i - j);
}
}
}
return ret;
}
};