Given an array nums and a target value k, find the maximum length of a subarray that sums to k. If there isn‘t one, return 0 instead.
Note:
The sum of the entire nums array is guaranteed to fit within the 32-bit signed integer range.
Example 1:
Given nums = [1, -1, 5, -2, 3]
, k = 3
,
return 4
. (because the subarray [1, -1, 5, -2]
sums to 3 and is the longest)
Example 2:
Given nums = [-2, -1, 2, 1]
, k = 1
,
return 2
. (because the subarray [-1, 2]
sums to 1 and is the longest)
Follow Up:
Can you do it in O(n) time?
1 public class Solution { 2 public int MaxSubArrayLen(int[] nums, int k) { 3 var sums = new int[nums.Length]; 4 var sum = 0; 5 var dict = new Dictionary<int, int>(); 6 7 for (int i = 0; i < nums.Length; i++) 8 { 9 sum += nums[i]; 10 sums[i] = sum; 11 } 12 13 int max = 0; 14 dict[0] = -1; 15 16 for (int i = 0; i < sums.Length; i++) 17 { 18 var delta = sums[i] - k; 19 if (dict.ContainsKey(delta)) 20 { 21 max = Math.Max(max, i - dict[delta]); 22 } 23 24 if (!dict.ContainsKey(sums[i])) 25 { 26 dict[sums[i]] = i; 27 } 28 } 29 30 return max; 31 } 32 }